go标准库的学习-mime
参考:https://studygolang.com/pkgdoc
导入方法:
import "mime"
mime实现了MIME的部分规定。
什么是MIME:
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型,设计的最初目的是为了在发送电子邮件时附加多媒体数据,让邮件客户程序能根据其类型进行处理。
之后则是用来设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
- 非ASCII字符文本;
- 非文本格式附件(二进制、声音、图像等);
- 由多部分(multiple parts)组成的消息体;
- 包含非ASCII字符的头信息(Header information)。
func AddExtensionType
func AddExtensionType(ext, typ string) error
函数将扩展名和mimetype建立偶联;扩展名应以点号开始,例如".html"。
即自定义你的文件扩展名(以.开头)和与之关联的,比如:
mime.AddExtensionType(".svg", "image/svg+xml")
这个例子就是如果文件的扩展名为".svg",那么它对应的mimetype为"image/svg+xml"
func TypeByExtension
func TypeByExtension(ext string) string
函数返回与扩展名偶联的MIME类型。扩展名应以点号开始,如".html"。如果扩展名未偶联类型,函数会返回""。
内建的偶联表很小,但在unix系统会从本地系统的一或多个mime.types文件(参加下表)进行增补。
/etc/mime.types
/etc/apache2/mime.types
/etc/apache/mime.types
Windows系统的mime类型从注册表获取。文本类型的字符集参数默认设置为"utf-8"。
举例:
package main import( "fmt" "mime" ) func main() { mineType1 := mime.TypeByExtension(".svg") fmt.Println(mineType1) //image/svg+xml mineType2 := mime.TypeByExtension(".svv") //一开始是没有与该扩展名相关的mineType fmt.Println(mineType2) //为空 err := mime.AddExtensionType(".svv", "mytype/none")//在这里添加后在查找就能够查找到了 if err != nil{ fmt.Println(err) } mineType3 := mime.TypeByExtension(".svv") fmt.Println(mineType3) //mytype/none }
func FormatMediaType
func FormatMediaType(t string, param map[string]string) string
函数根据RFC 2045和 RFC 2616的规定将媒体类型t和参数param连接为一个mime媒体类型,即mimetype,类型和参数都采用小写字母。任一个参数不合法都会返回空字符串。
举例:
package main import( "fmt" "mime" ) type formatTest struct { typ string params map[string]string } func main() { tests := []formatTest{ {"form-data",map[string]string{"name" : "foo"}}, {"form-data",map[string]string{"key" : "value", "blah" : "value", "name" : "foo"}}, {"application/x-stuff",map[string]string{"title*" : "us-ascii'en-us'This%20is%20%2A%2A%2Afun%2A%2A%2A"}}, {"attachment",map[string]string{"foo" : "\"\\", "filename" : "foo.html"}}, } for _, tt := range tests { got := mime.FormatMediaType(tt.typ, tt.params) fmt.Printf("mineType :%s\n", got) } }
返回:
userdeMBP:go-learning user$ go run test.go mineType :form-data; name=foo mineType :form-data; blah=value; key=value; name=foo mineType :application/x-stuff; title*=us-ascii'en-us'This%20is%20%2A%2A%2Afun%2A%2A%2A mineType :attachment; filename=foo.html; foo="\"\\"
func ParseMediaType
func ParseMediaType(v string) (mediatype string, params map[string]string, err error)
函数根据RFC 1521解析一个媒体类型值以及可能的参数,v即http header中的content-type。媒体类型值一般应为Content-Type和Conten-Disposition头域的值(参见RFC 2183)。成功的调用会返回小写字母、去空格的媒体类型和一个非空的map。返回的map映射小写字母的属性和对应的属性值。
举例:
package main import( "fmt" "mime" "log" ) func main() { mediaTypes := []string{ `form-data; name="foo"`, `form-data; key=value; blah="value";name="foo" `, `application/x-stuff; title*=us-ascii'en-us'This%20is%20%2A%2A%2Afun%2A%2A%2A`, `attachment; foo="\"\\";filename="foo.html"`, } for _, mm := range mediaTypes { mediatype, params, err := mime.ParseMediaType(mm) fmt.Printf("mediaType :%s, params: %v\n", mediatype, params) if err != nil{ log.Fatal(err) } } }
返回:
userdeMBP:go-learning user$ go run test.go mediaType :form-data, params: map[name:foo] mediaType :form-data, params: map[name:foo key:value blah:value] mediaType :application/x-stuff, params: map[title:This is ***fun***] mediaType :attachment, params: map[foo:"\ filename:foo.html]
其实就是上面例子的反过程