通过http接收大文件

安德烈·辛尼辛(Andrey Sinitsyn):

我试图通过http接收大文件(〜25Mb)。从“客户端”,我已经通过PHP和cUrl发送了此文件,并试图从golang接收它。
这是代码:

package main

import (
    "fmt"
    "net/http"
    "io/ioutil"
)

func handler(w http.ResponseWriter, r *http.Request) {
    buf, _ := ioutil.ReadAll(r.Body)
    fmt.Println(string(buf[:]))
}

func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":12100", nil)
}

在这种情况下,我可以在ioutil.ReadAll输出中看到我的文件但是,如果我尝试仅获取文件内容,则会失败:(

package main

import (
    "fmt"
    "net/http"
    "io/ioutil"
)

func handler(w http.ResponseWriter, r *http.Request) {
    r.ParseMultipartForm(0)
    fmt.Println(r.FormValue("f"))
}


func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":12100", nil)
}

但是文件很小(〜900Kb),一切正常。通过http发送大文件的正确方法是什么?

Abex:

Go将开始将大文件写入磁盘,这样它们就不会阻塞内存。然后,您可以FormFile用来获取磁盘上文件的句柄。完成后,您应该关闭句柄并使用删除临时文件r.MultipartForm.RemoveAll()

全部一起:

func handler(w http.ResponseWriter, r *http.Request) {
    r.ParseMultipartForm(0)
    defer r.MultipartForm.RemoveAll()
    fi, info, err := r.FormFile("f")
    defer fi.Close()
    fmt.Printf("Recieved %v",info.Filename)
    //Do whatever with it
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章