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