如何在不将请求存储在临时文件中的情况下处理通过 HTTP 上传的大文件

Dan*_*son 0 http stream go

我想向 golang 服务器提交一个带有大文件有效负载(最多几个 gbs)的 get 请求,而不是让它将多部分主体存储在文件系统上,然后将文件内容复制到缓冲区并转发它上,我想在请求的正文到达时将其转发到另一个服务(不存储任何内容)。这是一个修改后的(来自How can I receive an Uploaded file using a Golang net/http server?)非工作示例,用于发布请求:

func ReceiveFile(w http.ResponseWriter, r *http.Request) {
    var Buf bytes.Buffer
    file, header, err := r.FormFile("file")
    if err != nil {
        panic(err)
    }
    defer file.Close()
    io.Copy(&Buf, file)
    // stream Buf to grpc server
    Buf.Reset()
    return
}
Run Code Online (Sandbox Code Playgroud)

Bur*_*dar 5

如果您正在处理大型多部分数据,则应避免解析整个请求正文。相反,使用multipart包并将请求正文作为流读取(下面省略了错误处理):

m, p, _:=mime.ParseMediaType(req.Header.Get("Content-Type"))
boundary:=p["boundary"]
reader:=multipart.NewReader(req.Body,boundary)
for  {
  part, err:=reader.NextPart()
  if err==io.EOF {
    // Done reading body
    break
  }
  contentType:=part.Header.Get("Content-Type")
  fname:=part.FileName()
  // part is an io.Reader, deal with it
}
Run Code Online (Sandbox Code Playgroud)