?
This document uses PHP Chinese website manual Release
MIME 類(lèi)型的機(jī)理是告訴客戶(hù)端傳輸?shù)母鞣N文件:文件名的擴(kuò)展具有在網(wǎng)絡(luò)上沒(méi)有任何意義。因此,正確設(shè)置服務(wù)器非常重要,以便在每個(gè)文檔中傳輸正確的MIME類(lèi)型。瀏覽器通常使用 MIME 類(lèi)型來(lái)確定在獲取資源時(shí)要執(zhí)行的默認(rèn)操作。
文檔種類(lèi)很多,所以有很多種 MIME 類(lèi)型。在本文中,我們將列出 Web 開(kāi)發(fā)最重要的內(nèi)容,但您可以在此專(zhuān)用文章中找到適用于文檔類(lèi)型的內(nèi)容:完整的 MIME 類(lèi)型列表。
MIME 類(lèi)型不是傳達(dá)文檔類(lèi)型信息的唯一方式:
有時(shí)會(huì)使用名稱(chēng)后綴,特別是在 Microsoft Windows 系統(tǒng)上。并非所有操作系統(tǒng)都認(rèn)為這些后綴有意義(特別是 Linux 和 Mac OS),并且像外部 MIME 類(lèi)型一樣,不能保證它們是正確的。
魔術(shù)數(shù)字(Magic numbers)。不同類(lèi)型的文件的語(yǔ)法通過(guò)查看結(jié)構(gòu)允許文件類(lèi)型推斷。例如,每個(gè) GIF 文件以47 49 46 38十六進(jìn)制值 GIF89或帶有89 50 4E 47。PNG 的 PNG 文件開(kāi)頭。并非所有類(lèi)型的文件都有幻數(shù),所以這也不是100%可靠的系統(tǒng)。
在 Web 上,只有 MIME 類(lèi)型是相關(guān)的,應(yīng)該仔細(xì)設(shè)置。瀏覽器和服務(wù)器通常使用基于后綴或幻數(shù)的啟發(fā)式方法來(lái)定義MIME類(lèi)型,檢查一致性,或僅在提供通用類(lèi)型時(shí)查找正確的 MIME 類(lèi)型。
type/subtype
MIME 類(lèi)型的結(jié)構(gòu)非常簡(jiǎn)單; 它由一個(gè)類(lèi)型和一個(gè)子類(lèi)型組成,兩個(gè)字符串由'/'
分隔。沒(méi)有空間是允許的。該類(lèi)型代表類(lèi)別,可以是離散類(lèi)型或多部分類(lèi)型。該亞型是特定于每個(gè)類(lèi)型。
MIME 類(lèi)型不區(qū)分大小寫(xiě),但傳統(tǒng)上全部以小寫(xiě)形式。
text/plain text/html image/jpeg image/png audio/mpeg audio/ogg audio/* video/mp4 application/octet-stream …
離散類(lèi)型表示文檔的類(lèi)別,它可以是以下之一:
類(lèi)型 | 描述 | 典型的亞型的例子 |
---|---|---|
文本 | 代表任何包含文本且理論上可讀的文檔 | text / plain,text / html,text / css,text / javascript |
圖片 | 代表任何類(lèi)型的圖像。不包括視頻,雖然動(dòng)畫(huà)圖像(如動(dòng)畫(huà)GIF)用圖像類(lèi)型描述。 | 圖像/ gif,圖像/ png,圖像/ jpeg,圖像/ bmp,圖像/ webp |
音頻 | 代表任何類(lèi)型的音頻文件 | 音頻/ midi,音頻/ mpeg,音頻/ webm,音頻/ ogg,音頻/ wav |
視頻 | 代表任何類(lèi)型的視頻文件 | 視頻/ webm,視頻/ ogg |
應(yīng)用 | 代表任何種類(lèi)的二進(jìn)制數(shù)據(jù)。 | application / octet-stream,application / pkcs12,application / vnd.mspowerpoint,application / xhtml + xml,application / xml,application / pdf |
對(duì)于沒(méi)有特定子類(lèi)型的文本文檔,text/plain
應(yīng)該使用。同樣,application/octet-stream
應(yīng)該使用沒(méi)有特定或已知子類(lèi)型的二進(jìn)制文檔。
multipart/form-data multipart/byteranges
多部分類(lèi)型表示文檔類(lèi)別在不同部分中被破壞,通常具有不同的 MIME 類(lèi)型。這是表示復(fù)合文檔的一種方式。除了multipart/form-data
用于 HTML 表單和POST
方法的關(guān)聯(lián),并且multipart/byteranges
與206
Partial Content
狀態(tài)消息一起使用以?xún)H發(fā)送整個(gè)文檔的子集之外,HTTP 不以特定方式處理多部分文檔:消息是簡(jiǎn)單地傳輸?shù)綖g覽器(這可能會(huì)提出一個(gè)另存為窗口,不知道如何內(nèi)聯(lián)顯示文檔。)
application/octet-stream
這是二進(jìn)制文件的默認(rèn)值。由于它確實(shí)意味著未知的二進(jìn)制 文件,因此瀏覽器通常不會(huì)自動(dòng)執(zhí)行它,甚至不會(huì)詢(xún)問(wèn)是否應(yīng)該執(zhí)行它。他們把它看作Content-Disposition
是用值設(shè)置標(biāo)題attachment
并提出一個(gè)“另存為”文件。
text/plain
這是文本文件的默認(rèn)值。即使它確實(shí)意味著未知的文本文件,瀏覽器也會(huì)假定它們可以顯示它。
請(qǐng)注意,text/plain
這并不意味著任何類(lèi)型的文本數(shù)據(jù)。如果他們期望獲得特定類(lèi)型的文本數(shù)據(jù),他們可能不會(huì)認(rèn)為它是匹配的。特別是如果他們text/plain
從一個(gè)<link>
聲明一個(gè) CSS 文件的元素下載文件,他們將不會(huì)將其識(shí)別為有效的 CSS 文件(如果提供的話)text/plain
。text/css
必須使用 CSS MIME 類(lèi)型。
text/css
任何必須在 Web 頁(yè)面中解釋的 CSS 文件都必須是這些text/css
文件。通常,服務(wù)器無(wú)法識(shí)別帶有.css
后綴的文件作為 CSS 文件,而是使用text/plain
或application/octet-stream
MIME 類(lèi)型發(fā)送它們:在這些情況下,它們不會(huì)被大多數(shù)瀏覽器識(shí)別為 CSS 文件,并且將被忽略。必須特別注意以正確的類(lèi)型提供CSS文件。
text/html
所有的 HTML 內(nèi)容都應(yīng)該使用這種類(lèi)型。XHTML 的替代 MIME 類(lèi)型(如application/xml+html)
現(xiàn)在大多無(wú)用(HTML5 統(tǒng)一了這些格式))。
只有少數(shù)幾種圖像類(lèi)型被廣泛認(rèn)可,并被認(rèn)為是 Web 安全的,可以在網(wǎng)頁(yè)中使用:
MIME類(lèi)型 | 圖像類(lèi)型 |
---|---|
圖像/ GIF | GIF 圖像(無(wú)損壓縮,由 PNG 取代) |
圖像/ JPEG | JPEG 圖像 |
圖像/ PNG | PNG 圖像 |
圖像/ SVG + xml的 | SVG 圖像(矢量圖像) |
有一個(gè)關(guān)于將 WebP(image/webp
)添加到此列表的討論,但是由于每種新的圖像類(lèi)型都會(huì)增加代碼庫(kù)的大小,這可能會(huì)引入新的安全問(wèn)題,因此瀏覽器供應(yīng)商在接受它時(shí)非常謹(jǐn)慎。
其他類(lèi)型的圖像可以在 Web 文檔中找到。例如,許多瀏覽器支持 favicon 或類(lèi)似的圖標(biāo)圖像類(lèi)型。特別是,ICO 圖像在image/x-icon
MIME 類(lèi)型的上下文中得到支持。
與圖像類(lèi)似,HTML 并未定義一組支持的類(lèi)型以<audio>
與<video>
元素一起使用,因此只能在Web上使用相對(duì)較小的一組類(lèi)型。HTML音頻和視頻元素支持的媒體格式解釋了可以使用的編解碼器和容器格式。
這種文件的 MIME 類(lèi)型主要表示容器格式,Web 上下文中最常用的格式是:
MIME類(lèi)型 | 音頻或視頻類(lèi)型 |
---|---|
音頻/波形音頻/ wav音頻/ x-wav音頻/ x-pn-wav | WAVE 容器格式的音頻文件。PCM 音頻編解碼器(WAVE 編解碼器“1”)通常受支持,但其他編解碼器的支持更有限(如果有)。 |
音頻/ WEBM | WebM 容器格式的音頻文件。Vorbis 和 Opus 是最常見(jiàn)的音頻編解碼器。 |
視頻/ WEBM | 可能帶有音頻的視頻文件,采用 WebM 容器格式。VP8 和 VP9 是其中最常用的視頻編解碼器; Vorbis 和 Opus 是最常見(jiàn)的音頻編解碼器。 |
音頻/ OGG | OGG 容器格式的音頻文件。Vorbis 是這種容器中最常用的音頻編解碼器。 |
視頻/ OGG | OGG 容器格式的視頻文件,可能帶有音頻。Theora 是其中使用的通常的視頻編解碼器; Vorbis 是通常的音頻編解碼器。 |
應(yīng)用程序/ OGG | 使用 OGG 容器格式的音頻或視頻文件。Theora 是其中使用的通常的視頻編解碼器; Vorbis 是通常的音頻編解碼器。 |
multipart/form-data
將multipart/form-data
完整的 HTML 表單的內(nèi)容從瀏覽器發(fā)送到服務(wù)器時(shí),可以使用該類(lèi)型。作為正式的多部分文檔,它由不同部分組成,由邊界(以雙短劃線開(kāi)始的字符串)分隔'--'
。每個(gè)部分本身就是一個(gè)實(shí)體,具有自己的HTTP頭部,Content-Disposition
并且Content-Type
用于文件上傳字段,而最常見(jiàn)的部分(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>
將發(fā)送此消息:
POST / HTTP/1.1Host: localhost:8000User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0Accept: 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 類(lèi)型在發(fā)送部分響應(yīng)返回給瀏覽器的上下文中使用。當(dāng)206
Partial Content
被發(fā)送的狀態(tài)碼,此 MIME 類(lèi)型用于指示該文件是由幾個(gè)部分組成,一個(gè)用于每個(gè)所請(qǐng)求的范圍的。像其他多部分類(lèi)型一樣,Content-Type
使用該boundary
指令來(lái)定義邊界字符串。每個(gè)不同的部分都有一個(gè)Content-Type
標(biāo)題,其中包含文檔的實(shí)際類(lèi)型以及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/1270eta 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--
大多數(shù) Web 服務(wù)器使用默認(rèn)的application/octet-stream
MIME 類(lèi)型發(fā)送未知類(lèi)型的資源。出于安全原因,大多數(shù)瀏覽器不允許為這些資源設(shè)置自定義默認(rèn)操作,強(qiáng)制用戶(hù)將其存儲(chǔ)到磁盤(pán)以使用它。以下文件類(lèi)型會(huì)出現(xiàn)一些常見(jiàn)的錯(cuò)誤服務(wù)器配置:
RAR 編碼的文件。在這種情況下,理想的做法是設(shè)置編碼文件的真實(shí)類(lèi)型; 這通常是不可能的(因?yàn)榉?wù)器可能不知道這些文件可能包含多種不同類(lèi)型的資源)。在這種情況下,配置服務(wù)器發(fā)送application/x-rar-compressed
MIME 類(lèi)型,用戶(hù)不會(huì)為它們定義有用的默認(rèn)操作。
音頻和視頻文件。只有具有正確 MIME 類(lèi)型的資源才會(huì)被識(shí)別并播放<video>
或播放<audio>
。務(wù)必使用正確的音頻和視頻類(lèi)型。
專(zhuān)有文件類(lèi)型。提供專(zhuān)有文件類(lèi)型時(shí)要特別注意。避免使用,application/octet-stream
因?yàn)樘厥馓幚硎遣豢赡艿模捍蠖鄶?shù)瀏覽器不允許為這種通用 MIME 類(lèi)型定義默認(rèn)行為(如“在 Word 中打開(kāi)”).MIME 嗅探在沒(méi)有 MIME 類(lèi)型的情況下,或者在其他客戶(hù)端認(rèn)為它們?cè)O(shè)置不正確,瀏覽器可能會(huì)進(jìn)行 MIME 嗅探,這是通過(guò)查看資源來(lái)猜測(cè)正確的 MIME 類(lèi)型。每個(gè)瀏覽器在不同的情況下執(zhí)行此操作。這種做法存在一些安全問(wèn)題,因?yàn)橐恍?MIME 類(lèi)型代表可執(zhí)行內(nèi)容而其他 MIME 類(lèi)型不代表可執(zhí) 服務(wù)器可以阻止 MIME 嗅探通過(guò)發(fā)送X-Content-Type-Options
沿Content-Type
。見(jiàn)還