我需要阅读一个多部分表单文件。我将自定义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中工作,我真的很感激。
答案 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
}
}
}