MIME 类型 (IANA 媒体类型)
**媒体类型**(也称为**多用途互联网邮件扩展或 MIME 类型**)指示文档、文件或字节集合的性质和格式。MIME 类型在 IETF 的RFC 6838 中定义和标准化。
**互联网号码分配机构 (IANA)**负责所有官方 MIME 类型,您可以在其网站的媒体类型页面找到最新和完整的列表。
警告:浏览器使用 MIME 类型(而非文件扩展名)来确定如何处理 URL,因此 Web 服务器在响应的Content-Type
标头中发送正确的 MIME 类型非常重要。如果未正确配置,浏览器可能会错误地解释文件内容,网站将无法正常工作,下载的文件也可能被错误处理。
MIME 类型的结构
MIME 类型通常仅包含两个部分:一个类型和一个子类型,它们之间用斜杠 (/
) 分隔——之间没有空格。
type/subtype
**类型**表示数据类型所属的通用类别,例如video
或text
。
**子类型**标识 MIME 类型表示的指定类型的精确数据种类。例如,对于 MIME 类型text
,子类型可以是plain
(纯文本)、html
(HTML 源代码)或calendar
(用于 iCalendar/.ics
)文件。
每种类型都有自己的一组可能的子类型。MIME 类型始终同时具有类型和子类型,绝不会仅有一个。
可以添加可选的**参数**以提供其他详细信息。
type/subtype;parameter=value
例如,对于主类型为text
的任何 MIME 类型,都可以添加可选的charset
参数来指定用于数据中字符的字符集。如果未指定charset
,则默认为ASCII (US-ASCII
),除非被用户代理的设置覆盖。要指定 UTF-8 文本文件,使用 MIME 类型text/plain;charset=UTF-8
。
MIME 类型不区分大小写,但传统上以小写形式编写。参数值可能区分大小写。
类型
类型有两类:**离散**和**多部分**。离散类型是指表示单个文件或媒体的类型,例如单个文本或音乐文件,或单个视频。多部分类型表示由多个组成部分组成的文档,每个部分可能都有自己的 MIME 类型;或者,多部分类型可以封装在一个事务中一起发送的多个文件。例如,在将多个文件附加到电子邮件时,会使用多部分 MIME 类型。
离散类型
当前在 IANA 中注册的离散类型为:
application
-
任何不显式属于其他类型中的二进制数据;无论是将要执行或以某种方式解释的数据,还是需要特定应用程序或应用程序类别才能使用的数据。通用二进制数据(或类型未知的二进制数据)为
application/octet-stream
。其他常见示例包括application/pdf
、application/pkcs8
和application/zip
。(请参阅 IANA 中的应用程序类型注册表) audio
-
音频或音乐数据。示例包括
audio/mpeg
、audio/vorbis
。(请参阅 IANA 中的音频类型注册表) example
-
保留用于在显示如何使用 MIME 类型的示例中用作占位符。这些永远不要在示例代码列表和文档之外使用。
example
也可以用作子类型;例如,在一个与在网络上使用音频相关的示例中,MIME 类型audio/example
可以用来表示该类型是占位符,在现实世界中使用代码时应替换为合适的类型。 font
-
字体/字形数据。常见示例包括
font/woff
、font/ttf
和font/otf
。(请参阅 IANA 中的字体类型注册表) image
-
图像或图形数据,包括位图和矢量静止图像以及静止图像格式的动画版本,例如动画GIF或 APNG。常见示例为
image/jpeg
、image/png
和image/svg+xml
。(请参阅 IANA 中的图像类型注册表) model
-
3D 对象或场景的模型数据。示例包括
model/3mf
和model/vrml
。(请参阅 IANA 中的模型类型注册表) text
-
纯文本数据,包括任何人类可读的内容、源代码或文本数据,例如逗号分隔值 (CSV) 格式的数据。示例包括:
text/plain
、text/csv
和text/html
。(请参阅 IANA 中的文本类型注册表) video
-
视频数据或文件,例如 MP4 电影 (
video/mp4
)。(请参阅 IANA 中的视频类型注册表)
对于没有特定子类型的文本文档,应使用text/plain
。类似地,对于没有特定或已知子类型的二进制文档,应使用application/octet-stream
。
多部分类型
**多部分**类型指示分为多部分的文档类别,通常具有不同的 MIME 类型;它们也可以用于(尤其是在电子邮件场景中)表示多个单独的文件,这些文件都是同一事务的一部分。它们表示**复合文档**。
除了multipart/form-data
(用于POST
方法的HTML 表单)和multipart/byteranges
(与206
Partial Content
一起使用以发送文档的一部分)之外,HTTP 不会以特殊方式处理多部分文档:消息将传输到浏览器(如果浏览器不知道如何显示文档,则可能会显示“另存为”窗口)。
有两种多部分类型:
message
-
封装其他消息的消息。例如,这可以用来表示包含转发消息作为其数据一部分的电子邮件,或者允许以块的形式发送非常大的消息,就好像它是多条消息一样。示例包括
message/rfc822
(用于转发或回复的消息引用)和message/partial
,以允许将大型消息自动分解成较小的消息,以便由接收方重新组装。(请参阅 IANA 中的消息类型注册表) multipart
-
由多个组件组成的数据,这些组件可能分别具有不同的 MIME 类型。示例包括
multipart/form-data
(用于使用FormData
API 生成的数据)和multipart/byteranges
(在RFC 7233,第 5.4.1 节中定义,并与HTTP的206
“部分内容”响应一起使用,当获取的数据仅为内容的一部分时,例如使用Range
标头传递时)。(请参阅 IANA 中的多部分类型注册表)
Web 开发人员的重要 MIME 类型
application/octet-stream
这是二进制文件的默认值。由于它表示未知二进制文件,因此浏览器通常不会执行它,甚至不会询问是否应该执行它。它们将其视为Content-Disposition
标头设置为attachment
,并建议“另存为”对话框。
text/plain
这是文本文件的默认值。即使它确实意味着“未知文本文件”,浏览器也假设它们可以显示它。
注意:text/plain
并不意味着“任何类型的文本数据”。如果它们期望特定类型的文本数据,则可能不会将其视为匹配。具体来说,如果它们从声明 CSS 文件的<link>
元素下载text/plain
文件,如果提供text/plain
,则它们不会将其识别为有效的 CSS 文件。必须使用 CSS mime 类型text/css
。
text/css
用于设置网页样式的 CSS 文件**必须**使用text/css
发送。如果服务器无法识别 CSS 文件的.css
后缀,它可能会使用text/plain
或application/octet-stream
MIME 类型发送它们。如果是这样,大多数浏览器将无法识别它们为 CSS,并将被忽略。
text/html
所有 HTML 内容都应使用此类型提供服务。XHTML 的替代 MIME 类型(如application/xhtml+xml
)如今大多无用。
注意:如果您想要 XML 的严格解析规则、<![CDATA[…]]>
节或不属于 HTML/SVG/MathML 命名空间的元素,请使用application/xml
或application/xhtml+xml
。
text/javascript
根据IANA 媒体类型注册表、RFC 9239和HTML 规范,JavaScript 内容应始终使用 MIME 类型text/javascript
提供服务。没有其他 MIME 类型被认为对 JavaScript 有效,并且使用除text/javascript
之外的任何 MIME 类型都可能导致脚本无法加载或运行。
您可能会发现一些 JavaScript 内容错误地使用charset
参数作为 MIME 类型的一部分提供服务——试图为脚本内容指定字符集。该charset
参数对 JavaScript 内容无效,并且在大多数情况下会导致脚本无法加载。
旧版 JavaScript MIME 类型
除了text/javascript
MIME 类型之外,出于历史原因,MIME 嗅探标准(浏览器如何解释 MIME 类型并弄清楚如何处理没有有效 MIME 类型的內容的定义)也允许使用以下任何旧版 JavaScript MIME 类型提供 JavaScript:
application/javascript
已弃用application/ecmascript
已弃用application/x-ecmascript
非标准application/x-javascript
非标准text/ecmascript
已弃用text/javascript1.0
非标准text/javascript1.1
非标准text/javascript1.2
非标准text/javascript1.3
非标准text/javascript1.4
非标准text/javascript1.5
非标准text/jscript
非标准text/livescript
非标准text/x-ecmascript
非标准text/x-javascript
非标准
注意:即使任何给定的用户代理可能支持所有这些类型,您也应该只使用text/javascript
。它是唯一一个现在和将来都能保证有效的 MIME 类型。
图像类型
MIME 类型为image
的文件包含图像数据。子类型指定数据表示的具体图像文件格式。
以下图像类型使用频率足够高,可以被认为在网页上使用是安全的
image/apng
: 动画便携式网络图形 (APNG)image/avif
: AV1 图像文件格式 (AVIF)image/gif
: 图形交换格式 (GIF)image/jpeg
: 联合图像专家组图像 (JPEG)image/png
: 便携式网络图形 (PNG)image/svg+xml
: 可缩放矢量图形 (SVG)image/webp
: Web 图片格式 (WEBP)
图像文件类型和格式指南提供了有关何时使用不同图像格式的信息和建议。
音频和视频类型
与图像一样,HTML 并没有规定 Web 浏览器必须支持<audio>
和<video>
元素的任何特定文件和编解码器类型,因此在选择要用于媒体的文件类型和编解码器时,务必考虑您的目标受众以及他们可能使用的浏览器(以及这些浏览器的版本)。
我们的媒体容器格式指南提供了一个 Web 浏览器通常支持的文件类型列表,包括有关其特殊用例、任何缺点和兼容性信息以及其他详细信息。
音频编解码器和视频编解码器指南列出了 Web 浏览器通常支持的各种编解码器,提供了兼容性详细信息以及技术信息,例如它们支持多少个音频通道、使用哪种压缩类型以及它们在哪些比特率下有用等等。WebRTC 使用的编解码器指南通过专门介绍主要 Web 浏览器支持的编解码器来扩展此内容,因此您可以选择最适合您希望支持的浏览器范围的编解码器。
对于音频或视频文件的 MIME 类型,它们通常指定容器格式(文件类型)。可选的编解码器参数可以添加到 MIME 类型中,以进一步指定要使用的编解码器以及用于编码媒体的选项,例如编解码器配置文件、级别或其他此类信息。
有关常见媒体类型的更多信息,请参阅常见 MIME 类型页面。
multipart/form-data
当从浏览器向服务器发送已完成的HTML 表单的值时,可以使用multipart/form-data
类型。
作为一种多部分文档格式,它由不同的部分组成,这些部分以边界(一个以双破折号--
开头的字符串)分隔。每个部分都是其自己的实体,具有自己的 HTTP 标头、Content-Disposition
和Content-Type
(用于文件上传字段)。
Content-Type: multipart/form-data; boundary=aBoundaryString
(other headers associated with the multipart document as a whole)
--aBoundaryString
Content-Disposition: form-data; name="myFile"; filename="img.jpg"
Content-Type: image/jpeg
(data)
--aBoundaryString
Content-Disposition: form-data; name="myField"
(data)
--aBoundaryString
(more subparts)
--aBoundaryString--
以下<form>
<form
action="http://localhost:8000/"
method="post"
enctype="multipart/form-data">
<label>Name: <input name="myTextField" value="Test" /></label>
<label><input type="checkbox" name="myCheckBox" /> Check</label>
<label>
Upload file: <input type="file" name="myFile" value="test.txt" />
</label>
<button>Send the file</button>
</form>
将发送此消息
POST / HTTP/1.1
Host: localhost:8000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Content-Type: multipart/form-data; boundary=---------------------------8721656041911415653955004498
Content-Length: 465
-----------------------------8721656041911415653955004498
Content-Disposition: form-data; name="myTextField"
Test
-----------------------------8721656041911415653955004498
Content-Disposition: form-data; name="myCheckBox"
on
-----------------------------8721656041911415653955004498
Content-Disposition: form-data; name="myFile"; filename="test.txt"
Content-Type: text/plain
Simple file.
-----------------------------8721656041911415653955004498--
multipart/byteranges
multipart/byteranges
MIME 类型用于向浏览器发送部分响应。
当发送206 部分内容
状态代码时,此 MIME 类型表示文档由多个部分组成,每个部分对应一个请求的范围。与其他多部分类型一样,Content-Type
使用boundary
来分隔这些部分。每个部分都有一个Content-Type
标头,其中包含其实际类型和表示其范围的Content-Range
。
HTTP/1.1 206 Partial Content
Accept-Ranges: bytes
Content-Type: multipart/byteranges; boundary=3d6b6a416f9b5
Content-Length: 385
--3d6b6a416f9b5
Content-Type: text/html
Content-Range: bytes 100-200/1270
eta http-equiv="Content-type" content="text/html; charset=utf-8" />
<meta name="viewport" content
--3d6b6a416f9b5
Content-Type: text/html
Content-Range: bytes 300-400/1270
-color: #f0f0f2;
margin: 0;
padding: 0;
font-family: "Open Sans", "Helvetica
--3d6b6a416f9b5--
设置正确 MIME 类型的重要性
某些服务器配置可能会使用关联的 MIME 类型执行优化,例如文件连接、压缩或缓存。请参阅h5bp/server-configs-apache以了解 Apache 配置的示例,该配置压缩某些 MIME 类型的文件。
大多数 Web 服务器会将无法识别的资源发送为application/octet-stream
MIME 类型。出于安全原因,大多数浏览器不允许为此类资源设置自定义默认操作(例如“在 Word 中打开”),从而强制用户将其保存到磁盘以使用它。
一些常见的错误服务器配置
MIME 嗅探
在没有 MIME 类型的情况下,或在浏览器认为 MIME 类型不正确的情况下,浏览器可能会执行MIME 嗅探——通过查看资源的字节来猜测正确的 MIME 类型。
每个浏览器在不同的情况下执行 MIME 嗅探的方式也不同。(例如,如果发送的 MIME 类型不合适,Safari 会查看 URL 中的文件扩展名。)由于某些 MIME 类型表示可执行内容,因此存在安全问题。服务器可以通过发送X-Content-Type-Options
标头来防止 MIME 嗅探。
其他传递文档类型的方法
MIME 类型不是传达文档类型信息的唯一方法
- 文件名后缀有时会被使用,尤其是在 Microsoft Windows 上。并非所有操作系统都认为这些后缀有意义(例如 Linux 和 macOS),而且也不能保证它们是正确的。
- 幻数。不同格式的语法允许通过查看其字节结构来推断文件类型。例如,GIF 文件以十六进制值
47 49 46 38 39
(GIF89
)开头,PNG 文件以89 50 4E 47
(.PNG
)开头。并非所有文件类型都有幻数,因此这也不是 100% 可靠的。