Multipart文件上传:如何处理FileHeaders

时间:2016-10-08 20:17:41

标签: go multipartform-data multipart

我需要阅读一个多部分表单文件。我将自定义req obj传递给处理函数而不是http.request对象,我正在使用Gorilla Mux。 Handler Signature是这样的:

func handlerFunc(w http.ResponseWriter, cR *custReqObj)

我这样访问它:

fileHeaders := cR.MultipartForm.File["file"]
fileHeader := fileHeaders[0]
fileName := fileHeader.Filename
file, err := fileHeader.Open()

由于我没有请求对象,我不能这样做:

request.FormFile["file"]

我已经浏览了http.FormFile,它还返回了第一个文件头。

if r.MultipartForm != nil && r.MultipartForm.File != nil {
        if fhs := r.MultipartForm.File[key]; len(fhs) > 0 {
            f, err := fhs[0].Open()
            return f, fhs[0], err
        }
}

我的方法是否正确,在哪些情况下我需要考虑多个文件头? 如果您能了解文件头是什么以及多部分包如何在golang中工作,我真的很感激。

1 个答案:

答案 0 :(得分:2)

在使用req.ParseMultipartForm(SOME_SIZE)之前,您应该致电req.MultipartForm;类似的东西:

err := req.ParseMultipartForm(SOME_SIZE)
if err != nil {
    // ...
}

formdata := req.MultipartForm
for k, files := range formdata.File {
    for i := range files {
        file, err := files[i].Open()
        defer file.Close()
        if err != nil {
            // ...
        }

        fp := filepath.Join(someDirWithProperAccess, files[i].Filename)
        out, err := os.Create(fp)
        defer out.Close()
        if err != nil {
            // ...
        }

        _, err = io.Copy(out, file)

        if err != nil {
            logrus.Error(err)
            return
        }
    }
}