多部分文件上传:如何处理文件头(FileHeaders)

huangapple go评论69阅读模式
英文:

Multipart File Upload: How to Handle FileHeaders

问题

我需要读取一个多部分表单文件。我正在将自定义的 req 对象传递给处理函数,而不是使用 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 中的多部分包是如何工作的进行解释,我将非常感激。

英文:

I need to read a multipart form file. I'm passing custom req obj to handler function rather than the http.request object, I'm using Gorilla Mux.
Handler Signature is something like this:<br>

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

I'm accessing it like this:

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

Since I dont have a request object, i cannot do this:

request.FormFile[&quot;file&quot;]

I have gone through http.FormFile, it also returns the first file header.

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

Is my approach correct and in which cases I'll need to consider multiple file headers?
I'd really appreciate if you can shed some light on what is file header and how does multipart package work in golang.

答案1

得分: 3

在使用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
        }
    }
}
英文:

You should call req.ParseMultipartForm(SOME_SIZE) before using req.MultipartForm; something like:

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

huangapple
  • 本文由 发表于 2016年10月9日 04:17:41
  • 转载请务必保留本文链接:https://go.coder-hub.com/39936947.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定