【轉(zhuǎn)載請(qǐng)注明出處】:https://blog.csdn.net/huahao1989/article/details/107746738
多用途Internet郵件擴(kuò)展(MIME)類型 是一種標(biāo)準(zhǔn)化的方式來(lái)表示文檔的性質(zhì)和格式。 它在IETF RFC 6838中進(jìn)行了定義和標(biāo)準(zhǔn)化?;ヂ?lián)網(wǎng)號(hào)碼分配機(jī)構(gòu)(IANA)是負(fù)責(zé)跟蹤所有官方MIME類型的官方機(jī)構(gòu),您可以在媒體類型頁(yè)面中找到最新的完整列表。
瀏覽器通常使用MIME類型(而不是文件擴(kuò)展名)來(lái)確定如何處理文檔;因此服務(wù)器設(shè)置正確以將正確的MIME類型附加到響應(yīng)對(duì)象的頭部是非常重要的。
語(yǔ)法
通用結(jié)構(gòu)
type/subtype
MIME的組成結(jié)構(gòu)非常簡(jiǎn)單;由類型與子類型兩個(gè)字符串中間用'/'分隔而組成。不允許空格存在。type 表示可以被分多個(gè)子類的獨(dú)立類別。subtype 表示細(xì)分后的每個(gè)類型。
MIME類型對(duì)大小寫不敏感,但是傳統(tǒng)寫法都是小寫。
獨(dú)立類型
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
…
獨(dú)立類型表明了對(duì)文件的分類,可以是如下之一:
| 類型 | 描述 | 典型示例 |
|---|---|---|
text |
表明文件是普通文本,理論上是人類可讀 |
text/plain, text/html, text/css, text/javascript
|
image |
表明是某種圖像。不包括視頻,但是動(dòng)態(tài)圖(比如動(dòng)態(tài)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 |
表明是某種二進(jìn)制數(shù)據(jù) |
application/octet-stream, application/pkcs12, application/vnd.mspowerpoint, application/xhtml+xml, application/xml, application/pdf
|
對(duì)于text文件類型若沒有特定的subtype,就使用 text/plain。類似的,二進(jìn)制文件沒有特定或已知的 subtype,即使用 application/octet-stream。
Multipart 類型
multipart/form-data
multipart/byteranges
Multipart 類型表示細(xì)分領(lǐng)域的文件類型的種類,經(jīng)常對(duì)應(yīng)不同的 MIME 類型。這是復(fù)合文件的一種表現(xiàn)方式。multipart/form-data 可用于聯(lián)系HTML Forms和 POST方法,此外 multipart/byteranges使用狀態(tài)碼206 Partial Content來(lái)發(fā)送整個(gè)文件的子集,而HTTP對(duì)不能處理的復(fù)合文件使用特殊的方式:將信息直接傳送給瀏覽器(這時(shí)可能會(huì)建立一個(gè)“另存為”窗口,但是卻不知道如何去顯示內(nèi)聯(lián)文件。)
重要的MIME類型
application/octet-stream
這是應(yīng)用程序文件的默認(rèn)值。意思是 未知的應(yīng)用程序文件 ,瀏覽器一般不會(huì)自動(dòng)執(zhí)行或詢問(wèn)執(zhí)行。瀏覽器會(huì)像對(duì)待 設(shè)置了HTTP頭Content-Disposition值為attachment的文件一樣來(lái)對(duì)待這類文件。
在multipart/form-data類型的應(yīng)答消息體中,Content-Disposition消息頭可以被用在multipart消息體的子部分中,用來(lái)給出其對(duì)應(yīng)字段的相關(guān)信息。各個(gè)子部分由在Content-Type中定義的分隔符分隔。用在消息體自身則無(wú)實(shí)際意義。text/plain
文本文件默認(rèn)值。即使它意味著未知的文本文件,但瀏覽器認(rèn)為是可以直接展示的。
text/plain并不是意味著某種文本數(shù)據(jù)。如果瀏覽器想要一個(gè)文本文件的明確類型,瀏覽器并不會(huì)考慮他們是否匹配。比如說(shuō),如果通過(guò)一個(gè)表明是下載CSS文件的<link>鏈接下載了一個(gè)text/plain文件。如果提供的信息是text/plain,瀏覽器并不會(huì)認(rèn)出這是有效的CSS文件。CSS類型需要使用text/css。text/css
在網(wǎng)頁(yè)中要被解析為CSS的任何CSS文件必須指定MIME為text/css。通常,服務(wù)器不識(shí)別以.css為后綴的文件的MIME類型,而是將其以MIME為text/plain或application/octet-stream來(lái)發(fā)送給瀏覽器:在這種情況下,大多數(shù)瀏覽器不識(shí)別其為CSS文件,直接忽略掉。特別要注意為CSS文件提供正確的MIME類型。text/html
所有的HTML內(nèi)容都應(yīng)該使用這種類型。XHTML的其他MIME類型(如application/xml+html)現(xiàn)在基本不再使用(HTML5統(tǒng)一了這些格式)。
Note: You still need to use
application/xmlorapplication/xhtml+xmlif you intend to make use of XML’s strict parsing rules, use[<![CDATA[…]]>]or elements from non?HTML, non?SVG or non?MathML XML namespaces, astext/html’s parsing semantics are subtly incompatible with those ofapplication/xml.
-
JavaScript types
據(jù) MIME 嗅探標(biāo)準(zhǔn),下面是有效的 JavaScript MIME 類型application/javascriptapplication/ecmascriptapplication/x-ecmascriptapplication/x-javascripttext/ecmascripttext/javascripttext/javascript1.0text/javascript1.1text/javascript1.2text/javascript1.3text/javascript1.4text/javascript1.5text/jscripttext/livescripttext/x-ecmascripttext/x-javascript
所有的 text JavaScript 類型已經(jīng)被 RFC 4329 廢棄。
圖片類型
只有一小部分圖片類型是被廣泛支持的,Web安全的,可隨時(shí)在Web頁(yè)面中使用的:
| MIME 類型 | 圖片類型 |
|---|---|
image/gif |
GIF 圖片 (無(wú)損耗壓縮方面被PNG所替代) |
image/jpeg |
JPEG 圖片 |
image/png |
PNG 圖片 |
image/svg+xml |
SVG圖片 (矢量圖) |
此處的類型劃分有一定的爭(zhēng)議,有人認(rèn)為此處應(yīng)該增加 WebP(image/webp),但是每個(gè)新增的圖片類型都會(huì)增加代碼的數(shù)量,這會(huì)帶來(lái)一些新的安全問(wèn)題,所以瀏覽器供應(yīng)商對(duì)于添加類型非常小心。
另外的一些圖片種類可以在Web文檔中找到。比如很多瀏覽器支持 icon 類型的圖標(biāo)作為 favicons或者類似的圖標(biāo),并且瀏覽器在MIME類型中的 image/x-icon 支持ICO圖像
盡管
image/vnd.microsoft.icon在ANA注冊(cè), 它仍然不被廣泛支持,image/x-icon被作為替代品使用。
音頻與視頻類型
HTML并沒有明確定義被用于<audio>和<video>元素所支持的文件類型,所以在web上使用的只有相對(duì)較小的一組類型。文章 Media formats supported by the HTML audio and video elements 解釋了可以被使用的解碼器或視頻文件格式。
在web環(huán)境最常用的視頻文件的格式,是以下這些這些文件類型:
| 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 是這個(gè)多媒體文件格式最常用的音頻解碼器。 |
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表單從瀏覽器發(fā)送信息給服務(wù)器。作為多部分文檔格式,它由邊界線(一個(gè)由'--'開始的字符串)劃分出的不同部分組成。每一部分有自己的實(shí)體,以及自己的 HTTP 請(qǐng)求頭,Content-Disposition和 Content-Type用于文件上傳領(lǐng)域,最常用的 (Content-Length因?yàn)檫吔缇€作為分隔符而被忽略)。
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>
會(huì)發(fā)送這樣的請(qǐng)求:
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 用于把部分的響應(yīng)報(bào)文發(fā)送回瀏覽器。當(dāng)發(fā)送狀態(tài)碼206 Partial Content 時(shí),這個(gè)MIME類型用于指出這個(gè)文件由若干部分組成,每一個(gè)都有其請(qǐng)求范圍。就像其他很多類型Content-Type使用分隔符來(lái)制定分界線。每一個(gè)不同的部分都有Content-Type這樣的HTTP頭來(lái)說(shuō)明文件的實(shí)際類型,以及 Content-Range來(lái)說(shuō)明其范圍。
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--
設(shè)置正確的MIME類型的重要性
很多web服務(wù)器使用默認(rèn)的 application/octet-stream 來(lái)發(fā)送未知類型。出于一些安全原因,對(duì)于這些資源瀏覽器不允許設(shè)置一些自定義默認(rèn)操作,導(dǎo)致用戶必須存儲(chǔ)到本地以使用。常見的導(dǎo)致服務(wù)器配置錯(cuò)誤的文件類型如下所示:
RAR編碼文件。在這種情況,理想狀態(tài)是,設(shè)置真實(shí)的編碼文件類型;但這通常不可能(可能是服務(wù)器所未知的類型或者這個(gè)文件包含許多其他的不同的文件類型)。這這種情況服務(wù)器將發(fā)送
application/x-rar-compressed作為MIME類型,用戶不會(huì)將其定義為有用的默認(rèn)操作。音頻或視頻文件。只有正確設(shè)置了MIME類型的文件才能被
<video>或`<audio>識(shí)別和播放。 可參照 use the correct type for audio and video。專有文件類型。是專有文件時(shí)需要特別注意。使用
application/octet-stream作為特殊處理是不被允許的:對(duì)于一般的MIME類型瀏覽器不允許定義默認(rèn)行為(比如“在Word中打開”)
MIME 嗅探
在缺失 MIME 類型或客戶端認(rèn)為文件設(shè)置了錯(cuò)誤的 MIME 類型時(shí),瀏覽器可能會(huì)通過(guò)查看資源來(lái)進(jìn)行MIME嗅探。每一個(gè)瀏覽器在不同的情況下會(huì)執(zhí)行不同的操作。因?yàn)檫@個(gè)操作會(huì)有一些安全問(wèn)題,有的 MIME 類型表示可執(zhí)行內(nèi)容而有些是不可執(zhí)行內(nèi)容。瀏覽器可以通過(guò)請(qǐng)求頭 Content-Type來(lái)設(shè)置 X-Content-Type-Options以阻止MIME嗅探。
其他傳送文件類型的方法
MIME類型不是傳達(dá)文檔類型信息的唯一方式:
- 有時(shí)會(huì)使用名稱后綴,特別是在Microsoft Windows系統(tǒng)上。并非所有的操作系統(tǒng)都認(rèn)為這些后綴是有意義的(特別是Linux和Mac OS),并且像外部MIME類型一樣,不能保證它們是正確的。
- 魔術(shù)數(shù)字。不同類型的文件的語(yǔ)法通過(guò)查看結(jié)構(gòu)來(lái)允許文件類型推斷。例如,每個(gè)GIF文件以47 49 46 38十六進(jìn)制值[GIF89]或89 50 4E 47 [.PNG]的PNG文件開頭。 并非所有類型的文件都有幻數(shù),所以這也不是100%可靠的方式。
其他
- Properly configuring server MIME types
- Media formats supported by the HTML audio and video elements
- https://www.iana.org/assignments/media-types/application/json
歡迎關(guān)注 “后端老鳥” 公眾號(hào),接下來(lái)會(huì)發(fā)一系列的專題文章,包括Java、Python、Linux、SpringBoot、SpringCloud、Dubbo、算法、技術(shù)團(tuán)隊(duì)的管理等,還有各種腦圖和學(xué)習(xí)資料,NFC技術(shù)、搜索技術(shù)、爬蟲技術(shù)、推薦技術(shù)、音視頻互動(dòng)直播等,只要有時(shí)間我就會(huì)整理分享,敬請(qǐng)期待,現(xiàn)成的筆記、腦圖和學(xué)習(xí)資料如果大家有需求也可以公眾號(hào)留言提前獲取。由于本人在所有團(tuán)隊(duì)中基本都處于攻堅(jiān)和探路的角色,搞過(guò)的東西多,遇到的坑多,解決的問(wèn)題也很多,歡迎大家加公眾號(hào)進(jìn)群一起交流學(xué)習(xí)。
【轉(zhuǎn)載請(qǐng)注明出處】:https://blog.csdn.net/huahao1989/article/details/107746738