php小编新一今天为大家介绍一下Go语言中多部分Part.Read的正确用法。在处理HTTP请求时,我们经常会遇到需要读取多部分数据的情况,比如处理文件上传。Go语言的net/http包中提供了Part.Read方法来读取多部分数据,但是很多开发者在使用时会遇到一些问题。本文将详细讲解Part.Read的正确用法,帮助开发者更好地处理多部分数据,提高程序的稳定性和性能。让我们一起来看看吧!
我一直在尝试使用 multipart.part 来帮助从 http 读取非常大的文件上传 (>20gb) - 所以我编写了下面的代码,看起来效果很好:
func ReceiveMultipartRoute(w http.ResponseWriter, r *http.Request) { mediatype, p, err := mime.ParseMediaType(r.Header.Get("Content-Type")) if err != nil { //... } if mediatype != "multipart/form-data" { //... } boundary := p["boundary"] reader := multipart.NewReader(r.Body, boundary) buffer := make([]byte, 8192) for { part, err := reader.NextPart() if err != nil { // ... } f, err := os.CreateTemp("", part.FileName()) if err != nil { // ... } for { numBytesRead, err := part.Read(buffer) // People say not to read if there's an err, but then I miss the last chunk? f.Write(buffer[:numBytesRead]) if err != nil { if err == io.EOF { break } else { // error, abort ... return } } } } }
但是,在最里面的 for 循环中,我发现我必须在检查 eof 之前从 part.read 读取,因为我注意到如果我事先这样做并中断,我会错过最后一个块。但是,我注意到在许多其他文章/帖子中,人们检查错误/eof,并检查 break
-ing(如果有)而不使用上次读取的内容。我是否错误/安全地使用了 multipart.part.read() ?
您以正确的方式使用multipart.part。
multipart.part 是一个 特定 实现 go.dev/io#reader" rel="nofollow noreferrer">io.reader。因此,您应该遵循约定并遵循 io.reader 的建议。引用自文档:
调用者应始终在考虑错误 err 之前处理返回的 n > 0 字节。这样做可以正确处理读取一些字节后发生的 i/o 错误以及允许的 eof 行为。
另请注意,在示例中,您将数据从 io.reader 复制到 os.file。 os.file 实现 io.readerfrom 接口,因此您可以使用 file.readfrom() 方法复制数据。 p>
_, err := file.readfrom(part) // non io.eof if err != nil { return fmt.errorf("copy data: %w", err) }
如果需要使用缓冲区,可以使用io.copybuffer()函数。但请注意,您需要隐藏 io.readerfrom 实现,否则缓冲区 将不会使用 执行复制。请参阅示例:1、2,3。
_, err := io.CopyBuffer(writeFunc(file.Write), part, buffer) // non io.EOF if err != nil { return fmt.Errorf("copy data: %w", err) } type writeFunc func([]byte) (int, error) func (write writeFunc) Write(data []byte) (int, error) { return write(data) }
以上是Go - 多部分 Part.Read 的正确用法的详细内容。更多信息请关注PHP中文网其他相关文章!