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/byteranges206 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/plainapplication/octet-streamMIME 类型发送它们:在这些情况下,它们不会被大多数浏览器识别为 CSS 文件,并且将被忽略。必须特别注意以正确的类型提供CSS文件。

text/html

所有的 HTML 内容都应该使用这种类型。XHTML 的替代 MIME 类型(如application/xml+html)现在大多无用(HTML5 统一了这些格式))。

图像类型

只有少数几种图像类型被广泛认可,并被认为是 Web 安全的,可以在网页中使用:

MIME类型图像类型
图像/ GIFGIF 图像(无损压缩,由 PNG 取代)
图像/ JPEGJPEG 图像
图像/ PNGPNG 图像
图像/ SVG + xml的SVG 图像(矢量图像)

有一个关于将 WebP(image/webp)添加到此列表的讨论,但是由于每种新的图像类型都会增加代码库的大小,这可能会引入新的安全问题,因此浏览器供应商在接受它时非常谨慎。

其他类型的图像可以在 Web 文档中找到。例如,许多浏览器支持 favicon 或类似的图标图像类型。特别是,ICO 图像在image/x-iconMIME 类型的上下文中得到支持。

音频和视频类型

与图像类似,HTML 并未定义一组支持的类型以<audio>与<video>元素一起使用,因此只能在Web上使用相对较小的一组类型。HTML音频和视频元素支持的媒体格式解释了可以使用的编解码器和容器格式。

这种文件的 MIME 类型主要表示容器格式,Web 上下文中最常用的格式是:

MIME类型音频或视频类型
音频/波形音频/ wav音频/ x-wav音频/ x-pn-wavWAVE 容器格式的音频文件。PCM 音频编解码器(WAVE 编解码器“1”)通常受支持,但其他编解码器的支持更有限(如果有)。
音频/ WEBMWebM 容器格式的音频文件。Vorbis 和 Opus 是最常见的音频编解码器。
视频/ WEBM可能带有音频的视频文件,采用 WebM 容器格式。VP8 和 VP9 是其中最常用的视频编解码器; Vorbis 和 Opus 是最常见的音频编解码器。
音频/ OGGOGG 容器格式的音频文件。Vorbis 是这种容器中最常用的音频编解码器。
视频/ OGGOGG 容器格式的视频文件,可能带有音频。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/byterangesMIME 类型在发送部分响应返回给浏览器的上下文中使用。当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-streamMIME 类型发送未知类型的资源。出于安全原因,大多数浏览器不允许为这些资源设置自定义默认操作,强制用户将其存储到磁盘以使用它。以下文件类型会出现一些常见的错误服务器配置:

  • RAR 编码的文件。在这种情况下,理想的做法是设置编码文件的真实类型; 这通常是不可能的(因为服务器可能不知道这些文件可能包含多种不同类型的资源)。在这种情况下,配置服务器发送application/x-rar-compressedMIME 类型,用户不会为它们定义有用的默认操作。

  • 音频和视频文件。只有具有正确 MIME 类型的资源才会被识别并播放<video>或播放<audio>。务必使用正确的音频和视频类型。

  • 专有文件类型。提供专有文件类型时要特别注意。避免使用,application/octet-stream因为特殊处理是不可能的:大多数浏览器不允许为这种通用 MIME 类型定义默认行为(如“在 Word 中打开”).MIME 嗅探在没有 MIME 类型的情况下,或者在其他客户端认为它们设置不正确,浏览器可能会进行 MIME 嗅探,这是通过查看资源来猜测正确的 MIME 类型。每个浏览器在不同的情况下执行此操作。这种做法存在一些安全问题,因为一些 MIME 类型代表可执行内容而其他 MIME 类型不代表可执 服务器可以阻止 MIME 嗅探通过发送X-Content-Type-Options沿Content-Type。见还