文章目录
浏览器通常使用MIME类型(而不是文件扩展名)来确定如何处理文档;因此设置正确的MIME类型附加到headers是非常重要的。
语法
type/subtype
MIME的组成结构非常简单;由类型type
与子类型subtype
两个字符串中间用’/’分隔而成。不允许空格
存在。type表示可以被分多个子类的独立类型。subtype表示细分后的每个类型。
独立类型
text/plain
text/html
image/jpeg
image/png
audio/mpeg
audio/ogg
audio/*
video/mp4
application/*
application/json
application/javascript
application/ecmascript
application/octet-stream
......
独立类型表明了对文件的分类,可以是如下之一:
类型 | 描述 | 典型类型 |
---|---|---|
text | 表名文件是普通文本,理论是人类可读 | text/plain,text/html,text/css,text/javascript |
image | 表明是某种图形。不包括视频,但是动态图(gif)也可以使用image类型 | image/gif, image/png, image/jpeg, image/bmp, image/webp, image/x-icon, image/vnd.microsoft.icon |
audio | 表名是某种音频文件 | audio/midi, audio/mpeg, audio/webm, audio/ogg, audio/wav |
video | 表明是某种视频文件 | video/webm, video/ogg |
application | 表名是某种二进制 | application/octet-stream, application/pkcs12, application/vnd.mspowerpoint, application/xhtml+xml, application/xml, application/pdf |
一般的,如果没有显示的在
request headers
的Allow
上设置类型,浏览器的MIME
嗅探会推测出来对应的类型,如果发现找不到特定的子类型,则给出默认类型
,比如对于text
文件类型若没有特定的subtype,就使用text/plain
。类似的,二进制文件没有特定或已知的 subtype,即使用application/octet-stream
除了上面的基本的5中类型外,还有一种类型,即multipart类型。
Multipart 类型
- multipart/form-data
可用于联系 HTML Forms 和 POST 方法 - multipart/byteranges
Multipart 类型表示细分领域的文件类型的种类,经常对应不同的 MIME 类型。这是复合文件的一种表现方式。multipart/form-data 可用于联系 HTML Forms 和 POST 方法,此外 multipart/byteranges使用状态码206 Partial Content来发送整个文件的子集,而HTTP对不能处理的复合文件使用特殊的方式:将信息直接传送给浏览器(这时可能会建立一个“另存为”窗口,但是却不知道如何去显示内联文件。)
重要的MIME类型
application/octet-stream
这是应用程序文件的默认值。意思是 未知的应用程序文件
,浏览器一般不会自动执行或询问执行。浏览器会像对待 设置了HTTP头Content-Disposition 值为 attachment 的文件一样来对待这类文件。
text/plain
文本文件默认值。即使它意味着未知的文本文件,但浏览器认为是可以直接展示的。
text/plain并不是意味着某种文本数据。如果浏览器想要一个文本文件的明确类型,浏览器并不会考虑他们是否匹配。比如说,如果通过一个表明是下载CSS文件的
<link>
链接下载了一个text/plain
文件。如果提供的信息是text/plain
,浏览器并不会认出这是有效的CSS
文件。CSS
类型需要使用text/css
。
text/css
在网页中要被解析为CSS的任何CSS文件必须指定MIME为text/css
。通常,服务器不识别以.css为后缀的文件的MIME类型,而是将其以MIME为text/plain 或 application/octet-stream 来发送给浏览器:在这种情况下,大多数浏览器不识别其为CSS文件,直接忽略掉。特别要注意为CSS文件提供正确的MIME类型。
text/html
所有的HTML内容都应该使用这种类型。XHTML的其他MIME类型(如application/xml+html)现在基本不再使用(HTML5统一了这些格式)。
JavaScript types
据 MIME 嗅探标准,下面是有效的 JavaScript MIME 类型
application/javascript
application/ecmascript
text/javascript //text已废弃
所有的
text JavaScript
类型已经被RFC 4329
废弃。
图片类型
只有一小部分图片类型是被广泛支持的,Web安全的,可随时在Web页面中使用的:
MIME | 类型 | 图片类型 |
image/gif | GIF | 图片 (无损耗压缩方面被PNG所替代) |
image/jpeg | JPEG | 图片 |
image/png | PNG | 图片 |
image/svg+xml | SVG | 图片 (矢量图) |
表格里面的类型是可以随意用的,所有的浏览器都支持,而其他的类型可能被某个浏览器不支持
此处的类型划分有一定的争议,有人认为此处应该增加 WebP
(image/webp),但是每个新增的图片类型都会增加代码的数量,这会带来一些新的安全问题,所以浏览器供应商对于添加类型非常小心。
另外的一些图片种类可以在Web文档中找到。比如很多浏览器支持 icon 类型的图标作为 favicons或者类似的图标,并且浏览器在MIME类型中的 image/x-icon 支持ICO图像。
尽管 image/vnd.microsoft.icon
在ANA注册, 它仍然不被广泛支持,image/x-icon
被作为替代品使用。
音频与视频类型
HTML并没有明确定义被用于和元素所支持的文件类型,所以在web上使用的只有相对较小的一组类型。
在web环境最常用的视频文件的格式,是以下这些这些文件类型:
MIME 类型 | 音频或视频类型 |
---|---|
audio/wave audio/wav audio/x-wav audio/x-pn-wav | 音频流媒体文件。一般支持PCM音频编码 (WAVE codec “1”) ,其他解码器有限支持(如果有的话)。 |
audio/webm | WebM 音频文件格式。Vorbis 和 Opus 是其最常用的解码器。 |
video/webm | 采用WebM视频文件格式的音视频文件。VP8 和 VP9是其最常用的视频解码器。Vorbis 和 Opus 是其最常用的音频解码器。 |
audio/ogg | 采用OGG多媒体文件格式的音频文件。 Vorbis 是这个多媒体文件格式最常用的音频解码器。 |
video/ogg | 采用OGG多媒体文件格式的音视频文件。常用的视频解码器是 Theora;音频解码器为Vorbis 。 |
application/ogg | 采用OGG多媒体文件格式的音视频文件。常用的视频解码器是 Theora;音频解码器为Vorbis 。 |
application/json | application/json (MIME_type) |
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--
设置正确的MIME类型的重要性
很多web服务器使用默认的 application/octet-stream 来发送未知类型。出于一些安全原因,对于这些资源浏览器不允许设置一些自定义默认操作,导致用户必须存储到本地以使用。常见的导致服务器配置错误的文件类型如下所示:
-
RAR编码文件。在这种情况,理想状态是,设置真实的编码文件类型;但这通常不可能(可能是服务器所未知的类型或者这个文件包含许多其他的不同的文件类型)。这这种情况服务器将发送 application/x-rar-compressed 作为MIME类型,用户不会将其定义为有用的默认操作。
-
音频或视频文件。只有正确设置了MIME类型的文件才能被 或 识别和播放。 可参照 use the correct type for audio and video。
-
专有文件类型。是专有文件时需要特别注意。使用 application/octet-stream 作为特殊处理是不被允许的:对于一般的MIME类型浏览器不允许定义默认行为(比如“在Word中打开”)
MIME 嗅探
在缺失 MIME 类型
或客户端认为文件设置了错误的 MIME 类型时,浏览器可能会通过查看资源来进行MIME嗅探。每一个浏览器在不同的情况下会执行不同的操作。因为这个操作会有一些安全问题,有的 MIME 类型表示可执行内容而有些是不可执行内容。浏览器可以通过请求头 Content-Type 来设置 X-Content-Type-Options 以阻止MIME嗅探。