使用Golang处理大文件上传的HTTP请求

4

我正在使用golang的net/http包构建一个web服务器。现在我需要处理大文件上传,这意味着服务器可能会收到带有Expect: 100 Continue的请求。在接收到所有数据之前,我不会向客户端发送响应。然而,每次我完成一个请求并返回时,默认情况下golang都会发送一个响应回来,我该如何实现这个功能?


1
我不确定这是否有帮助,但是Go中的net/http服务器应该正确处理Expect请求。请查看http://golang.org/src/pkg/net/http/server.go#L1072和http://golang.org/src/pkg/net/http/serve_test.go#L741以获取更多信息。 - Intermernet
@Intermernet 谢谢!是的,我之前已经阅读过了。它处理了"100 Continues",只是告诉客户端服务器支持它并请求发送更多数据。我的问题是如何累积一个请求中的多个连续数据部分,并处理后再发送响应。 - rpbear
1
你是否正在使用multipart/form-data来上传文件?如果是的话,请尝试使用Request.MultipartReader(http://golang.org/pkg/net/http/#Request.MultipartReader)将请求数据作为流进行读取。 - Intermernet
可能有帮助,但上传大文件数据的“标准”方式是通过SFTP。 - Brad Peabody
3
@cheneydeng,像Intermernet所说的那样使用Request.MultipartReader,除非你有充分的理由不这样做。 - BurntSushi5
显示剩余3条评论
1个回答

0

使用request.ParseMultipartForm,

ParseMultipartForm将请求体解析为multipart/form-data。整个请求体被解析,最多maxMemory字节的文件部分存储在内存中,其余部分存储在临时文件中。如果需要,ParseMultipartForm会调用ParseForm。调用一次ParseMultipartForm后,随后的调用不会产生任何效果。

So yo just can do:

    import(
       "ioutil"
       "net/http"
    )
//check all posible errors, I´m assuming you just have one file per key
    func handler(w http.ResponseWriter, r *http.Request) {
        r.ParseMultipartForm(1000000) //1 MB in memory, the rest in disk
        datas := r.MultipartForm
        for k, headers := range datas.File {
            auxiliar, _ := headers[0].Open() //first check len(headers) is correct
            fileName:=headers[0].Filename
            file, _ := ioutil.ReadAll(auxiliar)
            // do what you need to do with the file
    }
}

在前端,你应该有一些像这样的 JavaScript:

function handleFile(url,file){
  let data=new FormData();
  data.append("key",file); //this is the key when ranging over map at backEnd
  fetch(url,{method:"PUT",body:data})
}


从Go 1.16开始,ioutil已被弃用。请参考https://pkg.go.dev/io/ioutil,了解在`io`和`os`中新函数的映射关系。具体来说,`ioutil.ReadAll`变为`io.ReadAll`。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接