通过http接收大文件

时间:2016-03-14 07:42:34

标签: http go

我试图通过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发送大文件的正确方法?

1 个答案:

答案 0 :(得分:2)

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
}