zoukankan      html  css  js  c++  java
  • 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
    ", 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
    ", 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]

    其实就是上面例子的反过程

     
     
     
  • 相关阅读:
    node.js
    Ajax常见面试题
    CF932E Team Work
    斯特林数
    UOJ #62. 【UR #5】怎样跑得更快
    洛谷 P4593 【[TJOI2018]教科书般的亵渎】
    洛谷 P4321 【随机漫游】
    洛谷 P4707 【重返现世】
    洛谷 P3175 [HAOI2015]按位或
    CF Gym101933K King's Colors
  • 原文地址:https://www.cnblogs.com/wanghui-garcia/p/10401375.html
Copyright © 2011-2022 走看看