【问题标题】:golang http handle big file uploadgolang http处理大文件上传
【发布时间】:2013-10-16 12:50:21
【问题描述】:

我正在使用 golang net/http 包来构建一个网络服务器。现在我必须处理大文件上传,这意味着服务器可能会收到带有 Expect: 100 Continue 的请求。我不会向客户端发送响应,直到所有数据已经收到。但是每次我完成一个请求并返回时,golang默认会发送一个响应,我该如何实现呢?

【问题讨论】:

  • 我不确定这是否有帮助,但 Go 中的 net/http 服务器应该能正确处理 Expect 请求。查看golang.org/src/pkg/net/http/server.go#L1072golang.org/src/pkg/net/http/serve_test.go#L741 了解更多信息。
  • @Intermernet 谢谢!嗯,是的,我以前读过,它处理 100 Continues 似乎只是告诉客户端服务器支持它并请求发送更多数据。而我的问题是如何我可以从一个请求的许多连续数据部分中累积所有数据并处理它然后发回响应吗?
  • 您是否使用 multipart/form-data 上传文件?如果是这样,请尝试Request.MultipartReader(golang.org/pkg/net/http/#Request.MultipartReader) 将请求数据作为流读取。
  • @Intermernet 不...我使用纯HTTP body 来承载数据(既不是chunk 也不是其他)。所以我想知道我的方式是否是上传大文件数据的标准方式?
  • @cheneydeng 使用 Request.MultipartReader 就像 Intermernet 说的,除非你有充分的理由不这样做。

标签: html file-upload webserver go


【解决方案1】:

使用 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})
}

【讨论】:

    猜你喜欢
    • 2017-02-18
    • 2016-01-16
    • 2017-11-12
    • 2010-09-14
    • 1970-01-01
    • 2013-07-09
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多