?
Dieses Dokument verwendet PHP-Handbuch für chinesische Websites Freigeben
MIME 類型的機理是告訴客戶端傳輸?shù)母鞣N文件:文件名的擴展具有在網(wǎng)絡(luò)上沒有任何意義。因此,正確設(shè)置服務(wù)器非常重要,以便在每個文檔中傳輸正確的MIME類型。瀏覽器通常使用 MIME 類型來確定在獲取資源時要執(zhí)行的默認操作。
文檔種類很多,所以有很多種 MIME 類型。在本文中,我們將列出 Web 開發(fā)最重要的內(nèi)容,但您可以在此專用文章中找到適用于文檔類型的內(nèi)容:完整的 MIME 類型列表。
MIME 類型不是傳達文檔類型信息的唯一方式:
有時會使用名稱后綴,特別是在 Microsoft Windows 系統(tǒng)上。并非所有操作系統(tǒng)都認為這些后綴有意義(特別是 Linux 和 Mac OS),并且像外部 MIME 類型一樣,不能保證它們是正確的。
魔術(shù)數(shù)字(Magic numbers)。不同類型的文件的語法通過查看結(jié)構(gòu)允許文件類型推斷。例如,每個 GIF 文件以47 49 46 38十六進制值 GIF89或帶有89 50 4E 47。PNG 的 PNG 文件開頭。并非所有類型的文件都有幻數(shù),所以這也不是100%可靠的系統(tǒng)。
在 Web 上,只有 MIME 類型是相關(guān)的,應(yīng)該仔細設(shè)置。瀏覽器和服務(wù)器通常使用基于后綴或幻數(shù)的啟發(fā)式方法來定義MIME類型,檢查一致性,或僅在提供通用類型時查找正確的 MIME 類型。
type/subtype
MIME 類型的結(jié)構(gòu)非常簡單; 它由一個類型和一個子類型組成,兩個字符串由'/'
分隔。沒有空間是允許的。該類型代表類別,可以是離散類型或多部分類型。該亞型是特定于每個類型。
MIME 類型不區(qū)分大小寫,但傳統(tǒng)上全部以小寫形式。
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 |
應(yīng)用 | 代表任何種類的二進制數(shù)據(jù)。 | application / octet-stream,application / pkcs12,application / vnd.mspowerpoint,application / xhtml + xml,application / xml,application / pdf |
對于沒有特定子類型的文本文檔,text/plain
應(yīng)該使用。同樣,application/octet-stream
應(yīng)該使用沒有特定或已知子類型的二進制文檔。
multipart/form-data multipart/byteranges
多部分類型表示文檔類別在不同部分中被破壞,通常具有不同的 MIME 類型。這是表示復合文檔的一種方式。除了multipart/form-data
用于 HTML 表單和POST
方法的關(guān)聯(lián),并且multipart/byteranges
與206
Partial Content
狀態(tài)消息一起使用以僅發(fā)送整個文檔的子集之外,HTTP 不以特定方式處理多部分文檔:消息是簡單地傳輸?shù)綖g覽器(這可能會提出一個另存為窗口,不知道如何內(nèi)聯(lián)顯示文檔。)
application/octet-stream
這是二進制文件的默認值。由于它確實意味著未知的二進制 文件,因此瀏覽器通常不會自動執(zhí)行它,甚至不會詢問是否應(yīng)該執(zhí)行它。他們把它看作Content-Disposition
是用值設(shè)置標題attachment
并提出一個“另存為”文件。
text/plain
這是文本文件的默認值。即使它確實意味著未知的文本文件,瀏覽器也會假定它們可以顯示它。
請注意,text/plain
這并不意味著任何類型的文本數(shù)據(jù)。如果他們期望獲得特定類型的文本數(shù)據(jù),他們可能不會認為它是匹配的。特別是如果他們text/plain
從一個<link>
聲明一個 CSS 文件的元素下載文件,他們將不會將其識別為有效的 CSS 文件(如果提供的話)text/plain
。text/css
必須使用 CSS MIME 類型。
text/css
任何必須在 Web 頁面中解釋的 CSS 文件都必須是這些text/css
文件。通常,服務(wù)器無法識別帶有.css
后綴的文件作為 CSS 文件,而是使用text/plain
或application/octet-stream
MIME 類型發(fā)送它們:在這些情況下,它們不會被大多數(shù)瀏覽器識別為 CSS 文件,并且將被忽略。必須特別注意以正確的類型提供CSS文件。
text/html
所有的 HTML 內(nèi)容都應(yīng)該使用這種類型。XHTML 的替代 MIME 類型(如application/xml+html)
現(xiàn)在大多無用(HTML5 統(tǒng)一了這些格式))。
只有少數(shù)幾種圖像類型被廣泛認可,并被認為是 Web 安全的,可以在網(wǎng)頁中使用:
MIME類型 | 圖像類型 |
---|---|
圖像/ GIF | GIF 圖像(無損壓縮,由 PNG 取代) |
圖像/ JPEG | JPEG 圖像 |
圖像/ PNG | PNG 圖像 |
圖像/ SVG + xml的 | SVG 圖像(矢量圖像) |
有一個關(guān)于將 WebP(image/webp
)添加到此列表的討論,但是由于每種新的圖像類型都會增加代碼庫的大小,這可能會引入新的安全問題,因此瀏覽器供應(yīng)商在接受它時非常謹慎。
其他類型的圖像可以在 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 是通常的音頻編解碼器。 |
應(yīng)用程序/ OGG | 使用 OGG 容器格式的音頻或視頻文件。Theora 是其中使用的通常的視頻編解碼器; Vorbis 是通常的音頻編解碼器。 |
multipart/form-data
將multipart/form-data
完整的 HTML 表單的內(nèi)容從瀏覽器發(fā)送到服務(wù)器時,可以使用該類型。作為正式的多部分文檔,它由不同部分組成,由邊界(以雙短劃線開始的字符串)分隔'--'
。每個部分本身就是一個實體,具有自己的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>
將發(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 類型在發(fā)送部分響應(yīng)返回給瀏覽器的上下文中使用。當206
Partial Content
被發(fā)送的狀態(tài)碼,此 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/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ù)器使用默認的application/octet-stream
MIME 類型發(fā)送未知類型的資源。出于安全原因,大多數(shù)瀏覽器不允許為這些資源設(shè)置自定義默認操作,強制用戶將其存儲到磁盤以使用它。以下文件類型會出現(xiàn)一些常見的錯誤服務(wù)器配置:
RAR 編碼的文件。在這種情況下,理想的做法是設(shè)置編碼文件的真實類型; 這通常是不可能的(因為服務(wù)器可能不知道這些文件可能包含多種不同類型的資源)。在這種情況下,配置服務(wù)器發(fā)送application/x-rar-compressed
MIME 類型,用戶不會為它們定義有用的默認操作。
音頻和視頻文件。只有具有正確 MIME 類型的資源才會被識別并播放<video>
或播放<audio>
。務(wù)必使用正確的音頻和視頻類型。
專有文件類型。提供專有文件類型時要特別注意。避免使用,application/octet-stream
因為特殊處理是不可能的:大多數(shù)瀏覽器不允許為這種通用 MIME 類型定義默認行為(如“在 Word 中打開”).MIME 嗅探在沒有 MIME 類型的情況下,或者在其他客戶端認為它們設(shè)置不正確,瀏覽器可能會進行 MIME 嗅探,這是通過查看資源來猜測正確的 MIME 類型。每個瀏覽器在不同的情況下執(zhí)行此操作。這種做法存在一些安全問題,因為一些 MIME 類型代表可執(zhí)行內(nèi)容而其他 MIME 類型不代表可執(zhí) 服務(wù)器可以阻止 MIME 嗅探通過發(fā)送X-Content-Type-Options
沿Content-Type
。見還