多用途Internet郵件擴展(MIME)類型 是一種標準化的方式來表示文檔的性質和格式。 它在IETF RFC 6838中進行了定義和標準化。互聯網號碼分配機構(IANA)是負責跟蹤全部官方MIME類型的官方機構,您能夠在媒體類型頁面中找到最新的完整列表。html
瀏覽器一般使用MIME類型(而不是文件擴展名)來肯定如何處理文檔;所以服務器設置正確以將正確的MIME類型附加到響應對象的頭部是很是重要的。java
語法
通用結構
type/subtype
MIME的組成結構很是簡單;由類型與子類型兩個字符串中間用'/'
分隔而組成。並不容許空格存在。type 表示能夠被分爲複數子類的獨立類型。subtype 表示細分後的每一個類型。web
MIME類型對大小寫不敏感,可是傳統寫法都是小寫。json
獨立類型
text/plain text/html image/jpeg image/png audio/mpeg audio/ogg audio/* video/mp4 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 |
audio |
代表是某種音頻文件 | audio/midi , audio/mpeg, audio/webm, audio/ogg, audio/wav |
video |
代表是某種視頻文件 | video/webm , video/ogg |
application |
代表是某種二進制數據 |
|
對於text文件類型若沒有特定的subtype,就使用 text/plain
。相似的,二進制文件沒有特定或已知的 subtype,即便用 application/octet-stream
。app
Multipart 類型
multipart/form-data multipart/byteranges
Multipart 類型表示細分領域的文件類型的種類,常常對應不一樣的 MIME 類型。這是複合文件的一種表現方式。對於 multipart/form-data
的例外部分,可使用HTML Forms 和 POST
方法,此外 multipart/byteranges
使用狀態碼206
Partial Content
來發送整個文件的子集,而HTTP不能處理的複合文件使用一個特殊的方式:將信息直接傳送給瀏覽器(這時可能會創建一個「另存爲」窗口,可是殊不知道如何去顯示內聯文件。)
重要的MIME類型
application/octet-stream
這是應用程序文件的默認值。意思是 未知的應用程序文件 ,瀏覽器通常不會自動執行或詢問執行。瀏覽器會像對待 設置了HTTP頭Content-Disposition
值爲「附件」的文件同樣來對待這類文件。
text/plain
文本文件默認值。意思是 未知的文本文件 ,瀏覽器認爲是能夠直接展現的。
text/plain
並非意味着某種文本數據。若是瀏覽器想要一個文本文件的明確類型,瀏覽器並不會考慮他們是否匹配。好比說,若是經過一個代表是下載CSS文件的<link>
連接下載了一個 text/plain
文件。若是提供的信息是text/plain,瀏覽器並不會認出這是有效的CSS文件。CSS類型須要使用text/css。
text/css
任何一個CSS文件想要在網頁上被解釋執行就必須爲text/css 文件。可是服務器常常不會分辨出使用.css後綴的CSS文件,而且將其MIME類型設置爲text/plain
或 application/octet-stream
發送:在這種狀況下,文件並不能被瀏覽器識別爲CSS文件而且會被直接忽略。因此特別注意要給CSS文件設置正確的類型。
text/html
全部的HTML內容都應該使用這種類型。XHTML的其餘MIME類型(如application/xml+html
)如今基本再也不使用(HTML5統一了這些格式)。
圖片類型
圖片類型是在網頁中使用的,惟一被普遍識別以及考慮過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圖像。
音頻與視頻類型
HTML並無明肯定義被用於<audio>
和<video>
元素所支持的文件類型,因此在web上使用的只有相對較小的一組類型。 Media formats supported by the HTML audio and video elements 這篇文章解釋了能夠被使用的解碼器或視頻文件格式。
在web環境最經常使用的視頻文件的格式,是如下這些這些文件類型:
MIME 類型 | 音頻或視頻類型 |
---|---|
audio/wave audio/wav audio/x-wav audio/x-pn-wav |
音頻流媒體文件。通常支持PCM音頻編碼,其餘解碼器有限支持(若是有的話)。 |
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) https://en.wikipedia.org/wiki/Media_type#Common_examples https://www.iana.org/assignments/media-types/application/json |
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
用於把部分的響應報文發送回瀏覽器。當發送狀態碼206
Partial Content
時,這個MIME類型用於指出這個文件由若干部分組成,每個都有其請求範圍。就像其餘不少類型Content-Type
使用分隔符來制定分界線。每個不一樣的部分都有Content-Type
這樣的HTTP頭來講明文件的實際類型,以及 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
來發送未知類型。出於一些安全緣由,對於這些資源瀏覽器不容許設置一些自定義默認操做,致使用戶必須存儲到本地以使用。常見的致使服務器配置錯誤的文件類型以下所示:
-
RAR編碼文件。在這種狀況,理想狀態是,設置真實的編碼文件類型;但這一般不可能(多是服務器所未知的類型或者這個文件包含許多其餘的不一樣的文件類型)。這這種狀況服務器將發送
application/x-rar-compressed
做爲MIME類型,用戶不會將其定義爲有用的默認操做。 -
音頻或視頻文件。只有正確設置了MIME類型的文件才能被
<video>
或<audio>
識別和播放。 可參照 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嗅探。
其餘傳送文件類型的方法
MIME類型不是傳達文檔類型信息的惟一方式:
- 有時會使用名稱後綴,特別是在Microsoft Windows系統上。並不是全部的操做系統都認爲這些後綴是有意義的(特別是Linux和Mac OS),而且像外部MIME類型同樣,不能保證它們是正確的。
- 魔術數字。不一樣類型的文件的語法經過查看結構來容許文件類型推斷。例如,每一個GIF文件以47 49 46 38十六進制值[GIF89]或89 50 4E 47 [.PNG]的PNG文件開頭。 並不是全部類型的文件都有幻數,因此這也不是100%可靠的方式。