媒体类型 (MIME 类型)
媒体类型(以前称为多用途互联网邮件扩展或 MIME 类型)表示文档、文件或字节集合的性质和格式。MIME 类型在 IETF 的 RFC 6838 中定义和标准化。
互联网号码分配机构 (IANA) 负责所有官方 MIME 类型,你可以在他们的 媒体类型 页面找到最新最完整的列表。
警告:浏览器使用 MIME 类型,而不是文件扩展名,来确定如何处理 URL,因此网络服务器在响应的 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 的 application 类型注册表) audio-
音频或音乐数据。示例包括
audio/mpeg、audio/vorbis。(参见 IANA 的 audio 类型注册表) 示例-
保留用作示例中的占位符,以展示如何使用 MIME 类型。这些绝不应在示例代码列表和文档之外使用。
example也可以用作子类型;例如,在与 Web 上的音频相关的示例中,MIME 类型audio/example可以用来表示该类型是一个占位符,在使用实际代码时应替换为适当的类型。 font-
字体/字型数据。常见示例包括
font/woff、font/ttf和font/otf。(参见 IANA 的 font 类型注册表) 图片-
图像或图形数据,包括位图和矢量静态图像,以及静态图像格式的动画版本,例如动画 GIF 或 APNG。常见示例是
image/jpeg、image/png和image/svg+xml。(参见 IANA 的 image 类型注册表) 模型-
3D 对象或场景的模型数据。示例包括
model/3mf和model/vrml。(参见 IANA 的 model 类型注册表) 文本-
纯文本数据,包括任何人类可读内容、源代码或文本数据,如逗号分隔值 (CSV) 格式数据。示例包括:
text/plain、text/csv和text/html。(参见 IANA 的 text 类型注册表) video-
视频数据或文件,例如 MP4 电影 (
video/mp4)。(参见 IANA 的 video 类型注册表)
对于没有特定子类型的文本文档,应使用 text/plain。同样,对于没有特定或已知子类型的二进制文档,应使用 application/octet-stream。
多部分型
多部分类型表示一类被分解成多个部分的文档,通常具有不同的 MIME 类型;它们也可以用于(尤其是在电子邮件场景中)表示多个单独的文件,这些文件都是同一事务的一部分。它们表示一个复合文档。
除了在 HTML 表单的 POST 方法中使用的 multipart/form-data 和与 206 Partial Content 一起用于发送文档一部分的 multipart/byteranges 之外,HTTP 不会以特殊方式处理多部分文档:消息被传输到浏览器(如果浏览器不知道如何显示文档,很可能会显示“另存为”窗口)。
有两种多部分类型:
message-
封装其他消息的消息。这可以用于,例如,表示包含转发消息作为其数据一部分的电子邮件,或者允许将非常大的消息分块发送,就像它是多条消息一样。示例包括
message/rfc822(用于转发或回复的消息引用)和message/partial,以允许将大消息自动分解成较小的消息,由收件人重新组装。(参见 IANA 的 message 类型注册表) 多部分-
由多个组件组成的数据,这些组件可能单独具有不同的 MIME 类型。示例包括
multipart/form-data(用于使用FormDataAPI 生成的数据)和multipart/byteranges(在 RFC 7233,第 5.4.1 节中定义,并与 HTTP 的206“Partial Content”响应一起使用,当获取的数据仅是内容的一部分时返回,例如使用Range头传送的内容)。(参见 IANA 的 multipart 类型注册表)
对 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
JavaScript 内容应始终以 MIME 类型 text/javascript 提供。出于历史原因,浏览器可能支持下面列出的一些旧版 JavaScript 类型,但你不应假定以除 text/javascript 之外的任何 MIME 类型提供的脚本将始终加载或运行。
请注意,在 HTML 中,<script> 元素的 type 属性只能包含JavaScript MIME 类型本质:text/javascript。包含任何参数(例如 charset=utf-8)与将 type 设置为任何其他 MIME 类型相同:脚本内容被视为数据块,不会作为 JavaScript 执行。(请注意,将 type 设置为 JavaScript MIME 类型本身是一个已弃用的功能:在这种情况下,你应该省略 type。)相反,在使用 HTTP Content-Type 头时,你可以像往常一样可选地指定 charset 参数。
更多信息请参见:IANA 媒体类型注册表、RFC 9239 和 HTML 规范。
旧版 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 类型。
application/json
JavaScript 对象表示法 (JSON) 是一种基于 JavaScript 对象语法的标准文本格式,用于表示结构化数据。它通常用于 Web 应用程序中的数据传输。
图像类型
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 没有强制网络浏览器支持 <audio> 和 <video> 元素的任何特定文件和编解码器类型,因此在选择用于媒体的文件类型和编解码器时,考虑你的目标受众以及他们可能正在使用的浏览器(和这些浏览器的版本)的范围非常重要。
我们的媒体容器格式指南提供了网络浏览器通常支持的文件类型列表,包括有关其特殊用例、任何缺点和兼容性信息以及其他详细信息。
音频编解码器和视频编解码器指南列出了网络浏览器通常支持的各种编解码器,提供了兼容性详细信息以及技术信息,例如它们支持的音频通道数量、使用的压缩类型以及它们有用的比特率等。WebRTC 使用的编解码器指南在此基础上进行了扩展,专门涵盖了主流网络浏览器支持的编解码器,因此你可以选择最能覆盖你希望支持的浏览器范围的编解码器。
至于音频或视频文件的 MIME 类型,它们通常指定容器格式(文件类型)。可以将可选的 codecs 参数添加到 MIME 类型中,以进一步指定要使用的编解码器以及用于编码媒体的选项,例如编解码器配置文件、级别或其他此类信息。
有关常见媒体类型的更多信息,请参阅常见 MIME 类型页面。
multipart/form-data
当将已完成的 HTML 表单的值从浏览器发送到服务器时,可以使用 multipart/form-data 类型。
作为一种多部分文档格式,它由不同的部分组成,由一个边界(以双破折号 -- 开头的字符串)分隔。每个部分都是一个独立的实体,具有自己的 HTTP 头、Content-Disposition 和用于文件上传字段的 Content-Type。
Content-Type: multipart/form-data; boundary=boundaryString
(other headers associated with the multipart document as a whole)
--boundaryString
Content-Disposition: form-data; name="myFile"; filename="img.jpg"
Content-Type: image/jpeg
(data)
--boundaryString
Content-Disposition: form-data; name="myField"
(data)
--boundaryString
(more subparts)
--boundaryString--
以下 <form>
<form
action="https://: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 Partial Content 状态码时,此 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 类型的文件。
大多数网络服务器将无法识别的资源作为 application/octet-stream MIME 类型发送。出于安全原因,大多数浏览器不允许为此类资源设置自定义默认操作(例如“在 Word 中打开”),强制用户将其保存到磁盘才能使用。
一些常见的错误服务器配置
- RAR 压缩文件。在这种情况下,理想情况是原始文件的真实类型;这通常是不可能的,因为 .RAR 文件可以包含多种不同类型的资源。在这种情况下,将服务器配置为发送
application/x-rar-compressed。 - 音频和视频。只有具有正确 MIME 类型的资源才能在
<video>或<audio>元素中播放。请务必为音频和视频指定正确的媒体类型。 - 专有文件类型。像
application/vnd.mspowerpoint这样的特定类型允许用户自动在他们选择的演示软件中打开此类文件。
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% 可靠。