【发布时间】:2014-11-25 16:04:48
【问题描述】:
我正在使用 net/http 包编写一个服务器,除其他外,它接收通过 POST 上传的文件,其中包含 multipart/form-data 编码。
通过 net/http 文档,我设法编写了一个函数,该函数在请求上调用 ParseMultipartForm 方法,然后询问文件数据的 MultipartForm 字段,但我似乎被困在如何获取作为发布请求的一部分上传的单个文件的内容类型——request.go 源中所有与 ContentType 相关的引用似乎都与获取多部分/表单编码有关,并且当我 printf-dump 上传的文件信息时,我似乎没有看到任何看起来与内容类型相关的类型、字段或映射键。
这是我现在正在做的文件上传工作:
func save_multipart_upload(r *http.Request, savepath string) ([]string, error) {
fmt.Println("CALL: save_multipart_upload(r,"+savepath+")")
var savedfiles []string
err := r.ParseMultipartForm(100000)
if err != nil {
return savedfiles, err
}
m := r.MultipartForm
fmt.Printf("MPF: %#v \n", m)
for fname, _ := range r.MultipartForm.File {
files := m.File[fname]
fmt.Printf("files: %#v \n", m)
for i, _ := range files {
//for each fileheader, get a handle to the actual file
file, err := files[i].Open()
fmt.Printf("file: %#v \n", file)
defer file.Close()
if err != nil {
return savedfiles, err
}
//create destination file making sure the path is writeable.
var filename string
if savepath[:len(savepath)] == "/" {
filename = savepath + files[i].Filename
} else {
filename = savepath + "/" + files[i].Filename
}
dst, err := os.Create(filename)
if err != nil {
fmt.Println("Can't create "+filename+": "+err.Error())
return savedfiles, err
} else if _, err := io.Copy(dst, file); err != nil {
fmt.Println("Can't copy data %s: "+err.Error(), filename)
return savedfiles, err
} else {
fmt.Println("Saved %s successfully.", filename)
savedfiles = append(savedfiles, files[i].Filename)
}
}
}
/* end multipart upload */
fmt.Println("RETURN: receive_multipart_upload")
return savedfiles, err
}
如果我选择一个视频文件,这就是我从打印转储中看到的:
调用:save_multipart_upload(r,./static/000000000000000000000000/video/)
MPF: &multipart.Form{Value:map[string][]string{}, File:map[string][]*multipart.FileHeader{"file1":[]*multipart.FileHeader{(*multipart.FileHeader )(0xc21004e580)}}}
文件:&multipart.Form{Value:map[string][]string{}, File:map[string][]*multipart.FileHeader{"file1":[]*multipart.FileHeader{(*multipart.FileHeader )(0xc21004e580)}}}
文件:&os.File{file:(*os.file)(0xc210079510)}
已成功保存 %s。 ./static/0000000000000000000000000/video//2012-08-03 19.31.48.mov
返回:receive_multipart_upload
multipart.FileHeader 看起来可能是一个线索,但是当我向下钻取时,它有一个 Header 字段,它的类型为 textproto.MIMEHeader,它基本上看起来像是字符串到字符串的映射,所以我仍然不知道不知道要找什么。
任何想法和示例代码或对我所拥有的内容的建议更改将不胜感激!
【问题讨论】:
标签: http file-upload go content-type mime