golang 接收表单文件 笔记
MultipartForm是解析好的多部件表单,包括上传的文件。
本字段只有在调用ParseMultipartForm后才有效。
在客户端,会忽略请求中的本字段而使用Body替代。
type Request struct {
MultipartForm *multipart.Form
...
}
ParseMultipartForm将请求的主体作为multipart/form-data解析。请求的整个主体都会被解析,得到的文件记录最多maxMemery字节保存在内存,其余部分保存在硬盘的temp文件里
func (r *Request) ..ParseMultipartForm (maxMemory int64) error
Form是一个解析过的multipart表格。它的File参数部分保存在内存或者硬盘上,
可以使用*FileHeader类型属性值的Open方法访问。它的Value 参数部分保存为字符串,两者都以属性名为键。
//from package "mime/multipart"
type Form struct {
Value map[string][]string
File map[string][]*FileHeader
}
FileHeader描述一个multipart请求的(一个)文件记录的信息。
type FileHeader struct {
Filename string
Header textproto.MIMEHeader
// 内含隐藏或非导出字段
}
Open方法打开并返回其关联的文件。
func (fh *FileHeader) Open() (File, error)
File是一个接口,实现了对一个multipart信息中文件记录的访问。它的内容可以保持在内存或者硬盘中,
如果保持在硬盘中,底层类型就会是*os.File。
type File interface {
io.Reader
io.ReaderAt
io.Seeker
io.Closer
}
MIMEHeader代表一个MIME头,将键映射为值的集合。
//from package net/textproto
type MIMEHeader map[string][]string
Ext函数返回path文件扩展名。返回值是路径最后一个斜杠分隔出的路径元素的最后一个’.‘起始的后缀(包括’.’)。如果该元素没有’.'会返回空字符串。
//from package path
func Ext(path string) string
Mkdir使用指定的权限和名称创建一个目录。
func Mkdir (name string, perm FileMode) error
Create采用模式0666(任何人都可读写,不可执行)创建一个名为name的文件,
func Create (name string) (file *File, err error)
将src的数据拷贝到dst,直到在src上到达EOF或发生错误。返回拷贝的字节数和遇到的第一个错误。
func Copy (dst Writer, src Reader) (written int64, err error)
example
func uploadfiles(w http.ResponseWriter, r *http.Request) {
var tag = r.PostFormValue("tag")
r.ParseMultipartForm(10 << 20) //10mb
files := r.MultipartForm.File["file"]
length := len(files)
if length == 0 {
//....
return
}
//limite the file size cant more than 500kb
for i := 0; i < length; i++ {
size := files[i].Size
name := files[i].Filename
if size > 500<<10 {
//....
continue
}
//read the file name and limit the file type in image
file, err := files[i].Open()
defer file.Close()
ext := strings.ToLower(path.Ext(files[i].Filename))
if ext != ".jpg" && ext != ".png" {
//....
continue
}
//open the floder and save the file
os.Mkdir("./driver-test/"+tag, os.ModePerm)
cur, err := os.Create(filepath)
defer cur.Close()
if err != nil {
log.Fatal(err)
}
io.Copy(cur, file)
}
}
(未完待续)
本笔记作者:BlackCarDriver, 转载请声明出处:https://blog.youkuaiyun.com/BlackCarDriver
本文是关于Go语言处理表单文件的笔记,介绍了如何接收和解析multipart/form-data类型的表单,包括`MultipartForm`的使用,文件上传的处理,以及`Form`和`FileHeader`接口。文章还提到了`Open`方法用于访问上传的文件,以及相关文件操作如`Mkdir`和`Create`。
3万+

被折叠的 条评论
为什么被折叠?



