go標准庫的學習-mime


參考:https://studygolang.com/pkgdoc

導入方法:

import "mime"

mime實現了MIME的部分規定。

什么是MIME:

MIME(Multipurpose Internet Mail Extensions)多用途互聯網郵件擴展類型,設計的最初目的是為了在發送電子郵件時附加多媒體數據,讓郵件客戶程序能根據其類型進行處理。

之后則是用來設定某種擴展名的文件用一種應用程序來打開的方式類型,當該擴展名文件被訪問的時候,瀏覽器會自動使用指定應用程序來打開。多用於指定一些客戶端自定義的文件名,以及一些媒體文件打開方式。

它是一個互聯網標准,擴展了電子郵件標准,使其能夠支持:
  • 非ASCII字符文本;
  • 非文本格式附件(二進制、聲音、圖像等);
  • 由多部分(multiple parts)組成的消息體;
  • 包含非ASCII字符的頭信息(Header information)。
在該標准 之前的電子郵件標准並不允許在郵件消息中使用7位ASCII字符集以外的字符。因此,一些非英語字符消息和二進制文件,圖像,聲音等非文字消息原本都不能在電子郵件中傳輸。
 
在萬維網中使用的HTTP協議中也使用了MIME的框架,標准被擴展為互聯網媒體類型。最早的HTTP協議中,並沒有附加的數據類型信息,所有傳送的數據都被客戶程序解釋為超文本標記語言HTML 文檔,而為了支持多媒體數據類型,HTTP協議中就使用了附加在文檔之前的MIME數據類型信息來標識數據類型。
 

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]

其實就是上面例子的反過程

 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM