MIME Types
MIME 类型
MIME 类型
的机理是告诉客户端传输的各种文件:文件名的扩展具有在网络上没有任何意义。因此,正确设置服务器非常重要,以便在每个文档中传输正确的MIME类型。浏览器通常使用 MIME 类型
来确定在获取资源时要执行的默认操作。
文档种类很多,所以有很多种 MIME 类型。在本文中,我们将列出 Web 开发最重要的内容,但您可以在此专用文章中找到适用于文档类型的内容:完整的 MIME 类型列表。
MIME 类型不是传达文档类型信息的唯一方式:
- 有时会使用名称后缀,特别是在 Microsoft Windows 系统上。并非所有操作系统都认为这些后缀有意义(特别是 Linux 和 Mac OS),并且像外部 MIME 类型一样,不能保证它们是正确的。
- 魔术数字(Magic numbers)。不同类型的文件的语法通过查看结构允许文件类型推断。例如,每个 GIF 文件以47 49 46 38十六进制值 GIF89或带有89 50 4E 47。PNG 的 PNG 文件开头。并非所有类型的文件都有幻数,所以这也不是100%可靠的系统。
在 Web 上,只有 MIME 类型是相关的,应该仔细设置。浏览器和服务器通常使用基于后缀或幻数的启发式方法来定义MIME类型,检查一致性,或仅在提供通用类型时查找正确的 MIME 类型。
语法
一般结构
type/subtype
MIME 类型
的结构非常简单; 它由一个类型
和一个子类型
组成,两个字符串由'/'
分隔。没有空间是允许的。该类型
代表类别,可以是离散
类型
或多部分
类型
。该亚型
是特定于每个类型
。
MIME 类型不区分大小写,但传统上全部以小写形式。
离散类型
text/plain
text/html
image/jpeg
image/png
audio/mpeg
audio/ogg
audio/*
video/mp4
application/octet-stream
…
离散
类型表示文档的类别,它可以是以下之一:
类型 | 描述 | 典型的亚型的例子 |
---|---|---|
文本 | 代表任何包含文本且理论上可读的文档 | text / plain,text / html,text / css,text / javascript |
图片 | 代表任何类型的图像。不包括视频,虽然动画图像(如动画GIF)用图像类型描述。 | 图像/ gif,图像/ png,图像/ jpeg,图像/ bmp,图像/ webp |
音频 | 代表任何类型的音频文件 | 音频/ midi,音频/ mpeg,音频/ webm,音频/ ogg,音频/ wav |
视频 | 代表任何类型的视频文件 | 视频/ webm,视频/ ogg |
应用 | 代表任何种类的二进制数据。 | application / octet-stream,application / pkcs12,application / vnd.mspowerpoint,application / xhtml + xml,application / xml,application / pdf |
对于没有特定子类型的文本文档,text/plain
应该使用。同样,application/octet-stream
应该使用没有特定或已知子类型的二进制文档。
多部分类型
multipart/form-data
multipart/byteranges
多部分
类型表示文档类别在不同部分中被破坏,通常具有不同的 MIME 类型。这是表示复合
文档的一种方式。除了multipart/form-data
用于 HTML 表单
和POST
方法的关联,并且multipart/byteranges
与206
Partial Content
状态消息一起使用以仅发送整个文档的子集之外,HTTP 不以特定方式处理多部分
文档:消息是简单地传输到浏览器(这可能会提出一个另存为窗口,不知道如何内联显示文档。)
Web 开发人员的重要 MIME 类型
application/octet-stream
这是二进制文件的默认值。由于它确实意味着未知的二进制
文件,因此浏览器通常不会自动执行它,甚至不会询问是否应该执行它。他们把它看作Content-Disposition
是用值设置标题attachment
并提出一个“另存为”文件。
text/plain
这是文本文件的默认值。即使它确实意味着未知的文本
文件,浏览器也会假定它们可以显示它。
请注意,text/plain这并不意味着任何类型的文本数据。如果他们期望获得特定类型的文本数据,他们可能不会认为它是匹配的。特别是如果他们text/plain从一个<link>声明一个 CSS 文件的元素下载文件,他们将不会将其识别为有效的 CSS 文件(如果提供的话)text/plain。text/css必须使用 CSS MIME 类型。
text/css
任何必须
在 Web 页面中解释的 CSS 文件都必须
是这些text/css
文件。通常,服务器无法识别带有.css
后缀的文件作为 CSS 文件,而是使用text/plain
或application/octet-stream
MIME 类型发送它们:在这些情况下,它们不会被大多数浏览器识别为 CSS 文件,并且将被忽略。必须
特别注意以正确的类型提供CSS文件。
text/html
所有的 HTML 内容都应该使用这种类型。XHTML 的替代 MIME 类型(如application/xml+html)
现在大多无用(HTML5 统一了这些格式))。
图像类型
只有少数几种图像类型被广泛认可,并被认为是 Web 安全的,可以在网页中使用:
MIME类型 | 图像类型 |
---|---|
图像/ GIF | GIF 图像(无损压缩,由 PNG 取代) |
图像/ JPEG | JPEG 图像 |
图像/ PNG | PNG 图像 |
图像/ SVG + xml的 | SVG 图像(矢量图像) |
有一个关于将 WebP(image/webp
)添加到此列表的讨论,但是由于每种新的图像类型都会增加代码库的大小,这可能会引入新的安全问题,因此浏览器供应商在接受它时非常谨慎。
其他类型的图像可以在 Web 文档中找到。例如,许多浏览器支持 favicon 或类似的图标图像类型。特别是,ICO 图像在image/x-icon
MIME 类型的上下文中得到支持。
音频和视频类型
与图像类似,HTML 并未定义一组支持的类型以<audio>与<video>元素一起使用,因此只能在Web上使用相对较小的一组类型。HTML音频和视频元素支持的媒体格式解释了可以使用的编解码器和容器格式。
这种文件的 MIME 类型主要表示容器格式,Web 上下文中最常用的格式是:
MIME类型 | 音频或视频类型 |
---|---|
音频/波形音频/ wav音频/ x-wav音频/ x-pn-wav | WAVE 容器格式的音频文件。PCM 音频编解码器(WAVE 编解码器“1”)通常受支持,但其他编解码器的支持更有限(如果有)。 |
音频/ WEBM | WebM 容器格式的音频文件。Vorbis 和 Opus 是最常见的音频编解码器。 |
视频/ WEBM | 可能带有音频的视频文件,采用 WebM 容器格式。VP8 和 VP9 是其中最常用的视频编解码器; Vorbis 和 Opus 是最常见的音频编解码器。 |
音频/ OGG | OGG 容器格式的音频文件。Vorbis 是这种容器中最常用的音频编解码器。 |
视频/ OGG | OGG 容器格式的视频文件,可能带有音频。Theora 是其中使用的通常的视频编解码器; Vorbis 是通常的音频编解码器。 |
应用程序/ OGG | 使用 OGG 容器格式的音频或视频文件。Theora 是其中使用的通常的视频编解码器; Vorbis 是通常的音频编解码器。 |
multipart/form-data
将multipart/form-data
完整的 HTML 表单
的内容从浏览器发送到服务器时,可以使用该类型。作为正式的多部分文档,它由不同部分组成,由边界(以双短划线开始的字符串)分隔'--'
。每个部分本身就是一个实体,具有自己的HTTP头部,Content-Disposition
并且Content-Type
用于文件上传字段,而最常见的部分(Content-Length
由于边界线用作分隔符而被忽略)。
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 action="http://localhost:8000/" method="post" enctype="multipart/form-data">
<input type="text" name="myTextField">
<input type="checkbox" name="myCheckBox">Check</input>
<input type="file" name="myFile">
<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="vieport" 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 类型的重要性
大多数 Web 服务器使用默认的application/octet-stream
MIME 类型发送未知类型的资源。出于安全原因,大多数浏览器不允许为这些资源设置自定义默认操作,强制用户将其存储到磁盘以使用它。以下文件类型会出现一些常见的错误服务器配置:
- RAR 编码的文件。在这种情况下,理想的做法是设置编码文件的真实类型; 这通常是不可能的(因为服务器可能不知道这些文件可能包含多种不同类型的资源)。在这种情况下,配置服务器发送
application/x-rar-compressed
MIME 类型,用户不会为它们定义有用的默认操作。
- 音频和视频文件。只有具有正确 MIME 类型的资源才会被识别并播放<video>或播放<audio>。务必使用正确的音频和视频类型。
- 专有文件类型。提供专有文件类型时要特别注意。避免使用,
application/octet-stream
因为特殊处理是不可能的:大多数浏览器不允许为这种通用 MIME 类型定义默认行为(如“在 Word 中打开”).MIME 嗅探在没有 MIME 类型的情况下,或者在其他客户端认为它们设置不正确,浏览器可能会进行 MIME 嗅探,这是通过查看资源来猜测正确的 MIME 类型。每个浏览器在不同的情况下执行此操作。这种做法存在一些安全问题,因为一些 MIME 类型代表可执行内容而其他 MIME 类型不代表可执 服务器可以阻止 MIME 嗅探通过发送X-Content-Type-Options
沿Content-Type
。见还