Go 多部分文件上载:如何处理文件头

Go 多部分文件上载:如何处理文件头,go,multipartform-data,multipart,Go,Multipartform Data,Multipart,我需要读取一个多部分表单文件。我将自定义req obj传递给handler函数,而不是http.request对象,我使用的是Gorilla Mux。 处理程序签名如下: func handlerFunc(w http.ResponseWriter, cR *custReqObj) 我是这样访问它的: fileHeaders := cR.MultipartForm.File["file"] fileHeader := fileHeaders[0] fileName := fileHeader.

我需要读取一个多部分表单文件。我将自定义req obj传递给handler函数,而不是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中是如何工作的,我将不胜感激。

在使用
req.MultipartForm
之前,您应该调用
req.ParseMultipartForm(一些大小)
;比如:

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

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