参考: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%%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%%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]

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

 
 
 

go标准库的学习-mime的更多相关文章

  1. go标准库的学习-mime/multipart

    参考:https://studygolang.com/pkgdoc 导入方式: import "mime/multipart" multipart实现了MIME的multipart ...

  2. go标准库的学习-net/http

    参考:https://studygolang.com/pkgdoc 概念解释: request:用户请求的信息,用来解析用户的请求信息,包括post.get.cookie.url等信息 respons ...

  3. go标准库的学习-database/sql

    参考:https://studygolang.com/pkgdoc 导入方式: import "database/sql" sql包提供了保证SQL或类SQL数据库的泛用接口. 使 ...

  4. go标准库的学习-crypto/md5

    参考:https://studygolang.com/pkgdoc 导入方式: import "crypto/md5" md5包实现了MD5哈希算法,参见RFC 1321. Con ...

  5. go标准库的学习-crypto/sha1

    参考:https://studygolang.com/pkgdoc 导入方式: import "crypto/sha1" sha1包实现了SHA1哈希算法,参见RFC 3174. ...

  6. go标准库的学习-crypto/sha256

    参考:https://studygolang.com/pkgdoc 导入方式: import "crypto/sha256" sha256包实现了SHA224和SHA256哈希算法 ...

  7. python 标准库基础学习之开发工具部分1学习

    #2个标准库模块放一起学习,这样减少占用地方和空间#标准库之compileall字节编译源文件import compileall,re,sys#作用是查找到python文件,并把它们编译成字节码表示, ...

  8. python calendar标准库基础学习

    # -*- coding: utf-8 -*-# 作者:新手__author__ = 'Administrator'#标准库:日期时间基础学习:calendar:处理日期#例1import calen ...

  9. 《C标准库》学习笔记整理

    简介 <C标准库>书中对 C 标准库中的 15 个头文件的内容进行了详细的介绍,包括各头文件设计的背景知识.头文件中的内容.头文件中定义的函数和变量的使用.实现.测试等. 我学习此书的目的 ...

随机推荐

  1. [转]ui-grid User can't select the row by clicking the select checkbox available in the respective row when enableFullRowSelection : true"

    本文转自:https://github.com/angular-ui/ui-grid/issues/5239 Try this style to enable checkbox selection: ...

  2. 探秘小程序(10):分享功能+webview

    场景: 小程序页面用webview嵌入了h5页面,h5页面需要与小程序进行交互,h5页面内容不同,分享的链接也不一样 分享功能: 小程序的分享功能即用户点击小程序右上角,转发功能页面.可以指定分享卡片 ...

  3. 关于 IdentityServer 部署到生产环境相关问题踩坑记录

    Idsr 定义了几种模式适用于不同的场景: // // 摘要: // OpenID Connect flows. public enum Flows { // // 摘要: // authorizat ...

  4. [转*译]Networking API Improvements in Windows 10

        在当今,以云优先,移动优先技术为宗旨的时代下,大多数Apps都至少有一些与web服务或网络上其他设备的集成.这些包括应用程序,它获取天气在线内容,新闻或体育比赛的分数,媒体或下载的播客,甚至对 ...

  5. 网络安全之sql注入

    1.何为Sql注入? 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有应用程序,将(恶意的)SQ ...

  6. Linux 中的命令链接操作符

    && 与 || 配合 eg: cat test.sh #!/bin/bash [ -e /etc/hosts ] && echo "ok" || e ...

  7. React中使用百度地图API

    今天我们来搞一搞如何在React中使用百度地图API好吧,最近忙的头皮发麻,感觉身体被掏空,所以很久都没来写博客了,但今天我一定要来一篇好吧 话不多说,我们直接开始好吧 特别注意:该React项目是用 ...

  8. 【Java入门提高篇】Day24 Java容器类详解(七)HashMap源码分析(下)

    前两篇对HashMap这家伙的主要方法,主要算法做了一个详细的介绍,本篇主要介绍HashMap中默默无闻地工作着的集合们,包括KeySet,values,EntrySet,以及对应的迭代器:HashI ...

  9. python第六十三天-- 第十一周作业

    题目:基于RabbitMQ rpc实现的主机管理 需求: 可以对指定机器异步的执行多个命令例子:>>:run "df -h" --hosts 192.168.3.55 ...

  10. EF扩展 更新指定字段

    using System.Data.Entity.Infrastructure; using System.Threading.Tasks; /// <summary> /// EF扩展 ...