英文:
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["file"]
fileHeader := fileHeaders[0]
fileName := fileHeader.Filename
file, err := fileHeader.Open()
Since I dont have a request object, i cannot do this:
request.FormFile["file"]
I have gone through http.FormFile, it also returns the first file header.
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
}
}
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
}
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论