D.2 MIME类型结构

每种 MIME 媒体类型都包含类型、子类型和可选参数的列表。类型和子类型由一个斜杠分隔,如果有可选参数的话,则以分号开始。在 HTTP 中,MIME 媒体类型被广泛用于 Content-TypeAccept 首部。下面是几个例子:

Content-Type: video/quicktime
Content-Type: text/html; charset="iso-8859-6"
Content-Type: multipart/mixed; boundary=gc0p4Jq0M2Yt08j34c0p
Accept: image/gif

D.2.1 离散类型

MIME 类型可以直接用于描述对象类型,也可以用于描述其他对象类型的集合或类型包。如果直接用 MIME 类型来描述某个对象类型,它就是一种离散类型(discrete type)。其中包括文本文件、视频和应用程序特有的文件格式。

D.2.2 复合类型

如果 MIME 类型描述的是其他内容的集合或封装包,这种 MIME 类型就被称为复合类型(composite type)。复合类型描述的是封装包的格式。将封装包打开时,其中包含的每个对象都会有其各自的类型。

D.2.3 多部分类型

多部分媒体类型是复合类型。多部分对象包含多个组件类型。下面是一个多部分 / 混合内容实例,每个组件都有自己的 MIME 类型:

Content-Type: multipart/mixed; boundary=unique-boundary-1

--unique-boundary-1
Content-type: 
text/plain; charset=US-ASCII

Hi there, I'm some boring ASCII text...

--unique-boundary-1
Content-Type: 
multipart/parallel; boundary=unique-boundary-2

--unique-boundary-2
Content-Type: 
audio/basic

    ... 8000 Hz single-channel mu-law-format
        audio data goes here ...

--unique-boundary-2
Content-Type: 
image/jpeg

    ... image data goes here ...

--unique-boundary-2--

--unique-boundary-1
Content-type: 
text/enriched

This is <bold><italic>enriched.</italic></bold>
<smaller>as defined in RFC 1896</smaller>

Isn't it <bigger><bigger>cool?</bigger></bigger>

--unique-boundary-1
Content-Type: 
message/rfc822

From: (mailbox in US-ASCII)
To: (address in US-ASCII)
Subject: (subject in US-ASCII)
Content-Type: Text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: Quoted-printable

    ... Additional text in ISO-8859-1 goes here ...

--unique-boundary-1--

D.2.4 语法

如前所述,MIME 类型由主类型、子类型和可选参数的列表组成。

主类型可以是预定义类型、IETF 定义的扩展标记,或者(以“x-”开头的)实验性标记。表 D-1 列出了一些常见的主类型。

表D-1 常见的主MIME类型

 

 类  型   描  述 
 application   应用程序特有的内容格式(离散类型) 
 audio   音频格式(离散类型) 
 chemical   化学数据集(离散 IETF 扩展类型) 
 image   图片格式(离散类型) 
 message   报文格式(复合类型) 
 model   三维模型格式(离散 IETF 扩展类型) 
 multipart   多部分对象集合(复合类型) 
 text   文本格式(离散类型) 
 video   视频电影格式(离散类型) 

子类型可以是主类型(比如,“text/text”)、IANA 注册的子类型,或者是(以“x-”开头的)实验性扩展标记。

类型和子类型都是由 US-ASCII 字符的一个子集构成的。空格和某些保留分组以及标点符号称为“tspecials”,它们是控制字符,不能用于类型和子类型名。

RFC 2046 定义的语法如下所示:

TYPE := "application" | "audio" | "image" | "message" | "multipart" |
        "text" | "video" | IETF-TOKEN | X-TOKEN
SUBTYPE := IANA-SUBTOKEN | IETF-TOKEN | X-TOKEN

IETF-TOKEN := <extension token with RFC and registered with IANA>
IANA-SUBTOKEN := <extension token registered with IANA>
X-TOKEN := <"X-" or "x-" prefix, followed by any token>

PARAMETER := TOKEN "=" VALUE
VALUE := TOKEN / QUOTED-STRING
TOKEN := 1*<any (US-ASCII) CHAR except SPACE, CTLs, or TSPECIALS>
TSPECIALS := "(" | ")" | "<" | ">" | "@" |
             "," | ";" | ":" | "\" | <"> |
             "/" | "[" | "]" | "?" | "="