go 学习笔记之处理表单文件

本文是关于Go语言处理表单文件的笔记,介绍了如何接收和解析multipart/form-data类型的表单,包括`MultipartForm`的使用,文件上传的处理,以及`Form`和`FileHeader`接口。文章还提到了`Open`方法用于访问上传的文件,以及相关文件操作如`Mkdir`和`Create`。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值