如何处理通过HTTP上传的大文件,而无需将请求存储在临时文件中



我想向golang服务器提交一个具有大文件有效负载(最多几个gbs(的get请求,但与其让它将多部分主体存储在文件系统上,然后将文件内容复制到缓冲区并转发,我想在请求到达时将请求正文转发到另一个服务(不存储任何内容(。这是一个修改后的(来自如何使用 Golang net/http 服务器接收上传的文件?(非工作示例,用于发布请求:

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
}

如果要处理大型多部分数据,则应避免分析整个请求正文。相反,请使用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
}

最新更新