【问题标题】:Multipart File Upload: How to Handle FileHeaders多部分文件上传:如何处理 FileHeaders
【发布时间】:2016-10-08 20:17:41
【问题描述】:

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

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 中的工作原理,我将不胜感激。

【问题讨论】:

  • 你如何定义custReqObj?我认为您需要在自定义请求中嵌入/包含Request 对象,以便您可以使用http.Request 中定义的方法。如the doc 中所述,Request.FormFile 仅返回第一个文件。如果你有多个文件或多个部分,你应该使用Request.MultipartReader读取每个部分,然后调用Part.FileNamePart.FormName访问相应的数据。

标签: go multipartform-data multipart


【解决方案1】:

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

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
        }
    }
}

【讨论】:

    猜你喜欢
    • 2018-12-03
    • 1970-01-01
    • 2021-04-03
    • 2018-08-03
    • 2011-03-28
    • 2023-03-11
    • 1970-01-01
    • 2015-07-02
    • 2017-02-05
    相关资源
    最近更新 更多