MIME Type

mimeinfographic

MIME 类型在网站开发中经常碰到,特别是处理非文本数据的请求时(如:文件上传)、或者是给浏览器返回非文本的响应时(如:文件下载),了解它的概念,可帮助理解 HTTP 协议。

1、概览

MIME(Multipurpose Internet Mail Extensions 多用途互联网邮件扩展)是一个能让 Email 支持更多格式的互联网标准。包括:

ASCII 文本,带字符集的文本;
非文本的附件;
含有多种格式的消息主体;
非 ASCII 字符集中的头信息;

MIME 被广泛使用,早就超出了用于描述邮件内容的范围,它同样用于描述互联网中的内容类型。

所有人们写的 Email,还有相当大比例的机器生成的 Email 都是用 MIME 标准通过 SMTP 发送的。Email 和 SMTP 和 MIME 标准的关系实在是太紧密,所以有时候我们把电子邮件叫做 SMTP/MIME Email。

MIME 标准的重要性不仅仅体现在 Email 中,在万维网的 HTTP 通信协议中也一样。HTTP 所请求的数据其实和 Email 的信息差不多,虽然数据大多数情况下并不是真正的 Email。

2、简介

基础的 SMTP (邮件传输协议),只支持 7-位 ASCII 字符,这大大限制了 Email 传输消息的能力,只有少部分语言(主要是英语)写的消息才能被正确传输。其他语言,比如拉丁文,还带变音符号的,在 7-位 ASCII 字符集中是不被支持的,意味着在 Email 中就不能正确显示这些语言。

MIME 定义了在 Email 中发送其他类型信息的机制。其中包括使用字符集编码的文本,还有 8-位 二进制内容的文件(比如:图片、声音、视频,还有可执行程序)。部分 MIME 标准在其他通信协议中被重用,比如 HTTP,它请求的数据都和 Email 长的很像,但实际上这些数据和 Email 没半点关系,数据主体实际上可以是二进制的。在 Email 的客户端和服务端,系统都会自动完成消息与 MIME 格式的映射工作。

MIME 是可扩展的。它可以注册一个新的内容类型和其他的 MIME 属性。

3、MIME 头

MIME 是通过标准化 Email 报文的头部的附加域(fields)实现的;这些头部的附加域中,可以定义消息的一些额外属性,比如:内容类型,还可以定义传输编码,这样就可以传输 8-位 的二进制数据。等等。

(1)MIME-Version

MIME-Version: 1.0

说明消息是 MIME 格式的,版本是 1.0

(2)Content-Type

内容类型(Content-Type),这个头用于指定消息的类型。一般以下面的形式出现。

type有下面这些形式:
text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式;
multipart:用于连接消息体的多个部分构成一个消息,这些部分可以是不同类型的数据;
application:用于传输应用程序数据或者二进制数据;
message:用于包装一个 Email 消息;
image:用于传输静态图片数据;
audio:用于传输音频或者音声数据;
video:用于传输动态影像数据,可以是与音频编辑在一起的视频数据格式。

subtype 用于指定 type 的详细形式。type/subtype 配对的集合,以及与此相关的参数,将随着时间而增长。为了确保这些值在一个有序而且公开的状态下开发,MIME 使用Internet Assigned Numbers Authority(IANA)作为中心的注册机制来管理这些值。

常用的 subtype 值如下所示:
text/plain(纯文本)
text/html(HTML文档)
application/xhtml+xml(XHTML文档)
image/gif(GIF图像)
image/jpeg(JPEG图像)
image/png(PNG图像)
video/mpeg(MPEG动画)
application/octet-stream(任意的二进制数据)
application/pdf(PDF文档)
application/msword(Microsoft Word文件)
application/vnd.wap.xhtml+xml (wap1.0+)
application/xhtml+xml (wap2.0+)
message/rfc822(RFC 822形式)
multipart/alternative(HTML邮件的HTML形式和纯文本形式,相同内容使用不同形式表示)
application/x-www-form-urlencoded(使用HTTP的POST方法提交的表单)
multipart/form-data(同上,但主要用于表单提交时伴随文件上传的场合)

此外,不是正式数据类型的 subtype,可以使用 x- 前缀表示(例如application/x-gzip)。vnd- 前缀也可以使用(例:application/vnd.ms-excel),vnd 是 vendor 的缩写。

parameter 可以用来指定附加的信息,更多情况下是用于指定 text/plain 和 text/html 等文本的编码方式的 charset 参数。MIME 根据 type 制定了默认的 subtype,当客户端不能确定消息的 subtype 的情况下,消息被看作默认的 subtype 进行处理。text 默认是 text/plain,application 默认是 application/octet-stream 而 multipart 默认情况下被看作 multipart/mixed。

(3)Content-Disposition

原始的 MIME 规范只描述了消息的结构,并没有描述表现风格,Content-Disposition(内容部署)头就是用来定义表现风格的。比如这个头:

在 HTTP 中,Content-Disposition 头经常用于暗示客户端把内容表现为可下载的文件。典型的情况是,当浏览器接收到这样一个响应时,它会向用户确认是否要保存这个文件,同时把 filename 参数作为默认的文件名(这对动态产生的内容相当有用)。

(4)Content-Transfer-Encoding

内容传输编码(Content-Transfer-Encoding),这个区域使指定ASCII以外的字符编码方式成为可能。形式如下:

其中,mechanism的值可以指定为 7bit,8bit,binary,quoted-printable,base64。

7bit:指的是7位的 ASCII 编码方式。
8bit:8位元 ASCII 码。
binary:二进制。
quoted-printable:因为欧洲的一些文字和 ASCII 字符集中的某些字符有部分相同。如果邮件消息使用的是这些语言的话,与 ASCII 重叠的那些字符可以原样使用,ASCII字符集中不存在的字符采用形如 “=??” 的方法编码。这里 “??” 需要用将字符编码后的 16 进制数字来指定。采用 quoted-printable 编码的消息,长度不会变得太长,而且大部分都是 ASCII 中的字符,即使不通过解码也大致可以读懂消息的内容。
base64:base64 是一种将二进制的 01 序列转化成 ASCII 字符的编码方法。编码后的文本或者二进制消息,就可以运用 SMTP 等只支持 ASCII 字符的协议传送了。base64 一般被认为会平均增加33%的报文长度,而且,经过编码的消息对于人类来说是不可读的。
x-encodingname:这个值是预留的扩展。

(5)其他,暂不列这么多了

HTTP 协议中用到很多 MIME 标准,比如上面的这些头部的域,了解其原始的意图,比阅读枯燥的 HTTP RFC 文档,还是要轻松很多。

 

翻译自 Wiki,封面图片为 MIME 历史。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">