媒體型別 (MIME 型別)
媒體型別(以前稱為多用途網際網路郵件擴充套件或 MIME 型別)表示文件、檔案或位元組集合的性質和格式。MIME 型別在 IETF 的 RFC 6838 中定義和標準化。
網際網路號碼分配機構 (IANA) 負責所有官方 MIME 型別,你可以在他們的 媒體型別 頁面找到最新最完整的列表。
警告:瀏覽器使用 MIME 型別,而不是副檔名,來確定如何處理 URL,因此網路伺服器在響應的 Content-Type 頭中傳送正確的 MIME 型別非常重要。如果配置不正確,瀏覽器可能會錯誤地解釋檔案內容,網站將無法正常工作,下載的檔案也可能會被錯誤處理。
MIME 型別的結構
MIME 型別通常由兩部分組成:一個型別和一個子型別,兩者之間用斜槓 (/) 分隔,沒有空格。
type/subtype
型別表示資料型別所屬的一般類別,例如 video 或 text。
子型別識別指定型別的 MIME 型別所表示資料的確切型別。例如,對於 MIME 型別 text,子型別可能是 plain(純文字)、html(HTML 原始碼)或 calendar(用於 iCalendar/.ics)檔案。
每個型別都有自己的一組可能的子型別。MIME 型別總是同時具有型別和子型別,絕不會只有其中一個。
可以新增一個可選的引數來提供額外的詳細資訊。
type/subtype;parameter=value
例如,對於主型別為 text 的任何 MIME 型別,你可以新增可選的 charset 引數來指定資料中字元所使用的字元集。如果未指定 charset,則預設使用 ASCII (US-ASCII),除非被使用者代理的設定覆蓋。要指定 UTF-8 文字檔案,請使用 MIME 型別 text/plain;charset=UTF-8。
MIME 型別不區分大小寫,但傳統上用小寫字母書寫。引數值可能區分大小寫。
型別
型別分為兩類:離散型和多部分型。離散型表示單個檔案或媒體,例如單個文字檔案、音樂檔案或單個影片。多部分型表示由多個元件部分組成的文件,每個部分可能都有自己的 MIME 型別;或者,多部分型可能封裝在一次事務中一起傳送的多個檔案。例如,在將多個檔案附加到電子郵件時使用多部分 MIME 型別。
離散型
目前在 IANA 註冊的離散型包括:
application-
不明確屬於其他型別中的任何一種的任何二進位制資料;要麼是將被以某種方式執行或解釋的資料,要麼是需要特定應用程式或應用程式類別才能使用的二進位制資料。通用二進位制資料(或其真實型別未知)是
application/octet-stream。其他常見示例包括application/pdf、application/pkcs8和application/zip。(參見 IANA 的 application 型別登錄檔) audio-
音訊或音樂資料。示例包括
audio/mpeg、audio/vorbis。(參見 IANA 的 audio 型別登錄檔) 示例-
保留用作示例中的佔位符,以展示如何使用 MIME 型別。這些絕不應在示例程式碼列表和文件之外使用。
example也可以用作子型別;例如,在與 Web 上的音訊相關的示例中,MIME 型別audio/example可以用來表示該型別是一個佔位符,在使用實際程式碼時應替換為適當的型別。 font-
字型/字型資料。常見示例包括
font/woff、font/ttf和font/otf。(參見 IANA 的 font 型別登錄檔) 圖片-
影像或圖形資料,包括點陣圖和向量靜態影像,以及靜態影像格式的動畫版本,例如動畫 GIF 或 APNG。常見示例是
image/jpeg、image/png和image/svg+xml。(參見 IANA 的 image 型別登錄檔) 模型-
3D 物件或場景的模型資料。示例包括
model/3mf和model/vrml。(參見 IANA 的 model 型別登錄檔) 文字-
純文字資料,包括任何人類可讀內容、原始碼或文字資料,如逗號分隔值 (CSV) 格式資料。示例包括:
text/plain、text/csv和text/html。(參見 IANA 的 text 型別登錄檔) video-
影片資料或檔案,例如 MP4 電影 (
video/mp4)。(參見 IANA 的 video 型別登錄檔)
對於沒有特定子型別的文字文件,應使用 text/plain。同樣,對於沒有特定或已知子型別的二進位制文件,應使用 application/octet-stream。
多部分型
多部分型別表示一類被分解成多個部分的文件,通常具有不同的 MIME 型別;它們也可以用於(尤其是在電子郵件場景中)表示多個單獨的檔案,這些檔案都是同一事務的一部分。它們表示一個複合文件。
除了在 HTML 表單的 POST 方法中使用的 multipart/form-data 和與 206 Partial Content 一起用於傳送文件一部分的 multipart/byteranges 之外,HTTP 不會以特殊方式處理多部分文件:訊息被傳輸到瀏覽器(如果瀏覽器不知道如何顯示文件,很可能會顯示“另存為”視窗)。
有兩種多部分型別:
message-
封裝其他訊息的訊息。這可以用於,例如,表示包含轉發訊息作為其資料一部分的電子郵件,或者允許將非常大的訊息分塊傳送,就像它是多條訊息一樣。示例包括
message/rfc822(用於轉發或回覆的訊息引用)和message/partial,以允許將大訊息自動分解成較小的訊息,由收件人重新組裝。(參見 IANA 的 message 型別登錄檔) 多部分-
由多個元件組成的資料,這些元件可能單獨具有不同的 MIME 型別。示例包括
multipart/form-data(用於使用FormDataAPI 生成的資料)和multipart/byteranges(在 RFC 7233,第 5.4.1 節中定義,並與 HTTP 的206“Partial Content”響應一起使用,當獲取的資料僅是內容的一部分時返回,例如使用Range頭傳送的內容)。(參見 IANA 的 multipart 型別登錄檔)
對 Web 開發者重要的 MIME 型別
application/octet-stream
這是二進位制檔案的預設設定。由於它表示未知二進位制檔案,瀏覽器通常不會執行它,甚至不會詢問是否應該執行。它們將其視為 Content-Disposition 頭已設定為 attachment,並建議一個“另存為”對話方塊。
text/plain
這是文字檔案的預設設定。即使它實際上意味著“未知文字檔案”,瀏覽器也會假定它們可以顯示它。
注意:text/plain 並不意味著“任何型別的文字資料”。如果它們期望特定型別的文字資料,它們很可能不會認為它匹配。特別是,如果它們從宣告 CSS 檔案的 <link> 元素下載 text/plain 檔案,如果呈現為 text/plain,它們將不會將其識別為有效的 CSS 檔案。必須使用 CSS MIME 型別 text/css。
text/css
用於樣式化網頁的 CSS 檔案必須以 text/css 傳送。如果伺服器不識別 CSS 檔案的 .css 字尾,它可能會以 text/plain 或 application/octet-stream MIME 型別傳送它們。如果是這樣,它們將不被大多數瀏覽器識別為 CSS 並將被忽略。
text/html
所有 HTML 內容都應以這種型別提供。XHTML 的替代 MIME 型別(如 application/xhtml+xml)如今大多無用。
注意:如果你想要 XML 的嚴格解析規則、<![CDATA[…]]> 部分,或不屬於 HTML/SVG/MathML 名稱空間的元素,請使用 application/xml 或 application/xhtml+xml。
text/javascript
JavaScript 內容應始終以 MIME 型別 text/javascript 提供。出於歷史原因,瀏覽器可能支援下面列出的一些舊版 JavaScript 型別,但你不應假定以除 text/javascript 之外的任何 MIME 型別提供的指令碼將始終載入或執行。
請注意,在 HTML 中,<script> 元素的 type 屬性只能包含JavaScript MIME 型別本質:text/javascript。包含任何引數(例如 charset=utf-8)與將 type 設定為任何其他 MIME 型別相同:指令碼內容被視為資料塊,不會作為 JavaScript 執行。(請注意,將 type 設定為 JavaScript MIME 型別本身是一個已棄用的功能:在這種情況下,你應該省略 type。)相反,在使用 HTTP Content-Type 頭時,你可以像往常一樣可選地指定 charset 引數。
更多資訊請參見:IANA 媒體型別登錄檔、RFC 9239 和 HTML 規範。
舊版 JavaScript MIME 型別
除了 text/javascript MIME 型別之外,出於歷史原因,MIME 嗅探標準(定義了瀏覽器應如何解釋 MIME 型別並確定如何處理沒有有效 MIME 型別的內容)還允許使用以下任何舊版 JavaScript MIME 型別提供 JavaScript:
application/javascript已棄用application/ecmascript已棄用application/x-ecmascript非標準application/x-javascript非標準text/ecmascript已棄用text/javascript1.0非標準text/javascript1.1非標準text/javascript1.2非標準text/javascript1.3非標準text/javascript1.4非標準text/javascript1.5非標準text/jscript非標準text/livescript非標準text/x-ecmascript非標準text/x-javascript非標準
注意:即使任何給定的使用者代理可能支援其中任何或所有這些型別,你也只應使用 text/javascript。它是唯一保證現在和將來都能正常工作的 MIME 型別。
application/json
JavaScript 物件表示法 (JSON) 是一種基於 JavaScript 物件語法的標準文字格式,用於表示結構化資料。它通常用於 Web 應用程式中的資料傳輸。
影像型別
MIME 型別為 image 的檔案包含影像資料。子型別指定資料表示的特定影像檔案格式。
以下影像型別在網頁上使用得足夠普遍,可以被認為是安全的:
image/apng:動畫可移植網路圖形 (APNG)image/avif:AV1 影像檔案格式 (AVIF)image/gif:圖形交換格式 (GIF)image/jpeg:聯合影像專家組影像 (JPEG)image/png:可移植網路圖形 (PNG)image/svg+xml:可伸縮向量圖形 (SVG)image/webp:Web 圖片格式 (WEBP)
影像檔案型別和格式指南提供了關於何時使用不同影像格式的資訊和建議。
音訊和影片型別
與影像情況一樣,HTML 沒有強制網路瀏覽器支援 <audio> 和 <video> 元素的任何特定檔案和編解碼器型別,因此在選擇用於媒體的檔案型別和編解碼器時,考慮你的目標受眾以及他們可能正在使用的瀏覽器(和這些瀏覽器的版本)的範圍非常重要。
我們的媒體容器格式指南提供了網路瀏覽器通常支援的檔案型別列表,包括有關其特殊用例、任何缺點和相容性資訊以及其他詳細資訊。
音訊編解碼器和影片編解碼器指南列出了網路瀏覽器通常支援的各種編解碼器,提供了相容性詳細資訊以及技術資訊,例如它們支援的音訊通道數量、使用的壓縮型別以及它們有用的位元率等。WebRTC 使用的編解碼器指南在此基礎上進行了擴充套件,專門涵蓋了主流網路瀏覽器支援的編解碼器,因此你可以選擇最能覆蓋你希望支援的瀏覽器範圍的編解碼器。
至於音訊或影片檔案的 MIME 型別,它們通常指定容器格式(檔案型別)。可以將可選的 codecs 引數新增到 MIME 型別中,以進一步指定要使用的編解碼器以及用於編碼媒體的選項,例如編解碼器配置檔案、級別或其他此類資訊。
有關常見媒體型別的更多資訊,請參閱常見 MIME 型別頁面。
multipart/form-data
當將已完成的 HTML 表單的值從瀏覽器傳送到伺服器時,可以使用 multipart/form-data 型別。
作為一種多部分文件格式,它由不同的部分組成,由一個邊界(以雙破折號 -- 開頭的字串)分隔。每個部分都是一個獨立的實體,具有自己的 HTTP 頭、Content-Disposition 和用於檔案上傳欄位的 Content-Type。
Content-Type: multipart/form-data; boundary=boundaryString
(other headers associated with the multipart document as a whole)
--boundaryString
Content-Disposition: form-data; name="myFile"; filename="img.jpg"
Content-Type: image/jpeg
(data)
--boundaryString
Content-Disposition: form-data; name="myField"
(data)
--boundaryString
(more subparts)
--boundaryString--
以下 <form>
<form
action="https://:8000/"
method="post"
enctype="multipart/form-data">
<label>Name: <input name="myTextField" value="Test" /></label>
<label><input type="checkbox" name="myCheckBox" /> Check</label>
<label>
Upload file: <input type="file" name="myFile" value="test.txt" />
</label>
<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 MIME 型別用於向瀏覽器傳送部分響應。
當傳送 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="viewport" 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 型別的重要性
某些伺服器配置可能會使用關聯的 MIME 型別來執行最佳化,例如檔案連線、壓縮或快取。請參閱 h5bp/server-configs-apache,瞭解 Apache 配置的示例,該配置壓縮某些 MIME 型別的檔案。
大多數網路伺服器將無法識別的資源作為 application/octet-stream MIME 型別傳送。出於安全原因,大多數瀏覽器不允許為此類資源設定自定義預設操作(例如“在 Word 中開啟”),強制使用者將其儲存到磁碟才能使用。
一些常見的錯誤伺服器配置
- RAR 壓縮檔案。在這種情況下,理想情況是原始檔案的真實型別;這通常是不可能的,因為 .RAR 檔案可以包含多種不同型別的資源。在這種情況下,將伺服器配置為傳送
application/x-rar-compressed。 - 音訊和影片。只有具有正確 MIME 型別的資源才能在
<video>或<audio>元素中播放。請務必為音訊和影片指定正確的媒體型別。 - 專有檔案型別。像
application/vnd.mspowerpoint這樣的特定型別允許使用者自動在他們選擇的演示軟體中開啟此類檔案。
MIME 嗅探
在缺少 MIME 型別或在某些瀏覽器認為其不正確的情況下,瀏覽器可能會執行MIME 嗅探——透過檢視資源的位元組來猜測正確的 MIME 型別。
每個瀏覽器在不同的情況下以不同的方式執行 MIME 嗅探。(例如,如果傳送的 MIME 型別不合適,Safari 會檢視 URL 中的副檔名。)存在安全問題,因為某些 MIME 型別表示可執行內容。伺服器可以透過傳送 X-Content-Type-Options 頭來防止 MIME 嗅探。
傳達文件型別的其他方法
MIME 型別不是傳達文件型別資訊的唯一方式
- 檔名字尾有時會被使用,尤其是在 Microsoft Windows 上。並非所有作業系統都認為這些字尾有意義(例如 Linux 和 macOS),並且不能保證它們是正確的。
- 魔術數字。不同格式的語法允許透過檢視它們的位元組結構來推斷檔案型別。例如,GIF 檔案以十六進位制值
47 49 46 38 39(GIF89) 開頭,PNG 檔案以89 50 4E 47(.PNG) 開頭。並非所有檔案型別都有魔術數字,所以這也不是 100% 可靠。