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

2022-09-19 10:09:49

golang 接收表单文件 笔记

MultipartForm是解析好的多部件表单,包括上传的文件。
本字段只有在调用ParseMultipartForm后才有效。
在客户端,会忽略请求中的本字段而使用Body替代。

type Requeststruct{
		MultipartForm*multipart.Form...}

ParseMultipartForm将请求的主体作为multipart/form-data解析。请求的整个主体都会被解析,得到的文件记录最多maxMemery字节保存在内存,其余部分保存在硬盘的temp文件里

func(r*Request)..ParseMultipartForm(maxMemoryint64)error

Form是一个解析过的multipart表格。它的File参数部分保存在内存或者硬盘上,
可以使用*FileHeader类型属性值的Open方法访问。它的Value 参数部分保存为字符串,两者都以属性名为键。

//from package "mime/multipart"type Formstruct{
		Valuemap[string][]string
		Filemap[string][]*FileHeader}

FileHeader描述一个multipart请求的(一个)文件记录的信息。

type FileHeaderstruct{
		Filenamestring
		Header   textproto.MIMEHeader// 内含隐藏或非导出字段}

Open方法打开并返回其关联的文件。

func(fh*FileHeader)Open()(File,error)

File是一个接口,实现了对一个multipart信息中文件记录的访问。它的内容可以保持在内存或者硬盘中,
如果保持在硬盘中,底层类型就会是*os.File。

type Fileinterface{
    	io.Reader
		io.ReaderAt
    	io.Seeker
    	io.Closer}

MIMEHeader代表一个MIME头,将键映射为值的集合。

//from package net/textprototype MIMEHeadermap[string][]string

Ext函数返回path文件扩展名。返回值是路径最后一个斜杠分隔出的路径元素的最后一个’.‘起始的后缀(包括’.’)。如果该元素没有’.'会返回空字符串。

//from package pathfuncExt(pathstring)string

Mkdir使用指定的权限和名称创建一个目录。

func Mkdir(namestring, perm FileMode)error

Create采用模式0666(任何人都可读写,不可执行)创建一个名为name的文件,

func Create(namestring)(file*File, errerror)

将src的数据拷贝到dst,直到在src上到达EOF或发生错误。返回拷贝的字节数和遇到的第一个错误。

func Copy(dst Writer, src Reader)(writtenint64, errerror)

example

funcuploadfiles(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 500kbfor i:=0; i< length; i++{
			size:= files[i].Size
			name:= files[i].Filenameif 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.csdn.net/BlackCarDriver

  • 作者:BlackCarDriver
  • 原文链接:https://blog.csdn.net/BlackCarDriver/article/details/88581069
    更新时间:2022-09-19 10:09:49