參考: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]
其實就是上面例子的反過程