文章目录
MIME类型
引言:
MIME(Multipurpose Internet Mail Extensions),本文将介绍 MIME 类型的概念,探讨它在 Web 开发中的应用,并提供一些实用的例子和建议。
什么是MIME类型
媒体类型(也通常称为多用途互联网邮件扩展或 MIME 类型)是一种标准,用来表示文档、文件或一组数据的性质和格式。每种 MIME 类型都由一个唯一的字符串标识,如 text/html 表示 HTML 文档,image/jpeg 表示 JPEG 图像。
MIME类型的结构
MIME 类型通常包含三个部分内容:类型(type
)、子类型(subtype
)、以及一个可选的参数(parameter=value
),类型与子类型中间由斜杠 /
分割,而可选参数则使用 ;
分割,中间没有空白字符。
type/subtype;parameter=value
- 类型代表数据类型所属的大致分类,例如
video
或text
。 - 子类型所代表的指定类型的确切数据类型。以
text
类型为例,它的子类型包括:plain
(纯文本)、html
(HTML 源代码)、calender
(iCalendar/.ics
文件)。 - 可选参数能够提供额外信息,例如
text
类型,可以添加可选的charset
参数(charset=utf-8),以指定数据中的字符所使用的字符集。
MIME类型的作用
它决定了浏览器如何处理从服务器发送到客户端的文件。通过正确设置 MIME 类型,可以确保浏览器能够正确地解析和显示文件内容。例如,浏览器将 text/html 类型的文件解析为 HTML 文档,并按照 HTML 标准进行渲染;将 image/jpeg 类型的文件解析为 JPEG 图像,并显示在页面上。
类型(type
)的分类
类型可分为两类:独立的(discrete)和多部分的(multipart)。独立类型代表单一文件或媒介,比如一段文字、一个音乐文件、一个视频文件等。而多部份类型,可以代表由多个部件组合成的文档,其中每个部分都可能有各自的 MIME 类型;此外,也可以代表多个文件被封装在单次事务中一同发送。多部分 MIME 类型的一个例子是,在电子邮件中附加多个文件。
独立类型
代表单一文件或媒介,比如一段文字text
、一个音乐文件audio
、一个视频文件video
等, 单一类型示例:
Content-Type:text/html
IANA 目前注册的独立类型如下:
-
不明确属于其他类型之一的任何二进制数据;要么是将以某种方式执行或解释的数据,要么是需要借助某个或某类特定应用程序来使用的二进制数据。通用二进制数据(或真实类型未知的二进制数据)是
application/octet-stream
。其他常用的示例包含application/pdf
、application/pkcs8
和application/zip
。(查看 IANA 上 application 类型的注册表) -
音频或音乐数据。常见的示例如
audio/mpeg
、audio/vorbis
。(查看 IANA 上 audio 类型的注册表) -
在演示如何使用 MIME 类型的示例中用作占位符的保留类型。这一类型永远不应在示例代码或文档外使用。
example
也可以作为子类型。例如,在一个处理音频有关的示例中,MIME 类型audio/example
表示该类型是一个占位符,且在实际使用这段代码时,此处应当被替换成适当的类型。 -
字体/字型数据。常见的示例如
font/woff
、font/ttf
和font/otf
。(查看 IANA 上 font 类型的注册表) -
图像或图形数据,包括位图和矢量静态图像,以及静态图像格式的动画版本,如 GIF 动画或 APNG。常见的例子有
image/jpeg
、image/png
和image/svg+xml
。(查看 IANA 上 image 类型的注册表) -
三维物体或场景的模型数据。示例包含
model/3mf
和model/vrml
。(查看 IANA 上 model 类型的注册表) -
纯文本数据,包括任何人类可读内容、源代码或文本数据——如逗号分隔值(comma-separated value,即 CSV)格式的数据。示例包含:
text/plain
、text/csv
和text/html
。(查看 IANA 上 text 类型的注册表) -
视频数据或文件,例如 MP4 电影(
video/mp4
)。(查看 IANA 上 video 类型的注册表)
对于那些没有明确子类型的文本文档,应使用 text/plain
。类似的,没有明确子类型或子类型未知的二进制文件,应使用 application/octet-stream
。
多部分类型
多部分类型,可以代表由多个部件(比如多段文字、多个音乐文件、多个视频文件等)组合成的文档,其中每个部分都可能有各自的单一类型的 MIME 类型;此外,也可以代表多个文件被封装在单次事务中一同发送,多部分类型示例:
Content-Type: multipart/form-data; boundary=aBoundaryString // boundary表示多个部分实体的分割符
--aBoundaryString // 分隔符
Content-Disposition: form-data; name="myFile"; filename="img.jpg"
Content-Type: image/jpeg // 每个部分都可能有各自的单一类型的 MIME 类型
(data)
--aBoundaryString // 分隔符
Content-Disposition: form-data; name="myField"; filename="test.mp4"
Content-Type: video/mp4 // 每个部分都可能有各自的单一类型的 MIME 类型
(data)
--aBoundaryString // 分隔符
有两种多部分类型:
-
封装其他信息的信息。例如,这可以用来表示将转发信息作为其数据一部分的电子邮件,或将超大信息分块发送,就像发送多条信息一样。例如,
message/rfc822
(用于转发或回复信息的引用)和message/partial
(允许将大段信息自动拆分成小段,由收件人重新组装)是两个常见的例子。(查看 IANA 上 message 类型的注册表) -
由多个组件组成的数据,这些组件可能各自具有不同的 MIME 类型。例如,
multipart/form-data
(用于使用FormData
API 生成的数据)和multipart/byteranges
(定义于 RFC 7233, section 5.4.1,当获取到的数据仅为部分内容时——如使用Range
标头传输的内容——与返回的 HTTP 响应206
“Partial Content”组合使用)。(查看 IANA 上 multipart 类型的注册表)
常见的MIME类型
文本类型
MIME 类型为 text
的文件包含文本数据。子类型指定数据所代表的具体文本文件格式。
text/plain
:文本文件的默认值。text/css
:在网页中要被解析为 CSS 的 CSS 文件必须指定 MIME 为text/css
。text/html
:与css同理,所有的 HTML 内容都应该使用这种类型。text/javascript
:JavaScript 内容应始终使用 MIME 类型text/javascript
提供,使用除text/javascript
以外的任何 MIME 类型都可能导致脚本无法加载或运行。
图片类型
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)
音频类型
MIME 类型为 audio
的文件包含音频数据。子类型指定数据所代表的具体音频文件格式。
-
audio/wav
:音频格式为WAV(Waveform Audio File Format,波形音频文件格式)。 -
audio/flac
:音频格式为FLAC(Free Lossless Audio Codec,免费无损音频编解码器)。 -
audio/ogg
:音频格式为OGG(Ogg Vorbis)。Ogg Vorbis是一种有损压缩格式,以优秀的压缩效率和音质著称(压缩率约为45%-85%)。 -
audio/aac
:音频格式为AAC(Advanced Audio Coding,高级音频编码)。AAC 是一种有损压缩技术,以更高的音频质量和更低的比特率相比MP3著称(压缩率约为10%-15%)。 -
audio/mpeg
:音频格式为MPEG(Moving Picture Experts Group,视频图像专家组),即MP3。 -
audio/wma
:音频格式为WMA(Windows Media Audio,Windows媒体音频)。 -
audio/webm
:音频格式为WebM(WebM Audio)。 -
视频类型
MIME 类型为 video
的文件包含视频数据,子类型指定数据所代表的具体视频文件格式。
video/mp4
:视频格式为MP4(MPEG-4 Part 14)。video/webm
:视频格式为WebM,采用VP8或VP9视频编码和Vorbis或Opus音频编码。video/ogg
:视频格式为Ogg。使用Theora视频编码。video/x-msvideo
:视频格式为AVI(Audio Video Interleave)。video/quicktime
:视频格式为QuickTime,由苹果公司开发。video/mpeg
:视频格式为MPEG(Moving Picture Experts Group)。
设置正确的 MIME 类型的重要性
很多 web 服务器使用默认的 application/octet-stream
来发送未知类型。出于一些安全原因,对于这些资源浏览器不允许设置一些自定义默认操作,强制用户必须存储到本地以使用。
常见的导致服务器配置错误的文件类型如下所示:
- RAR 压缩文件。在这种情况,理想状态是,设置真实的编码文件类型;但这通常不可能,因为 .RAR 文件可能包含多种不同类型的资源。这种情况,将所发送文件的 MIME 类型配置为
application/x-rar-compressed
。 - 音频或视频文件。只有正确设置了 MIME 类型的文件才能被
video
或audio
元素识别和播放。请确保指定了正确的音频和视频的媒体类型。 - 专有文件类型。避免使用
application/octet-stream
,对于这种一般的 MIME 类型浏览器不允许定义默认行为(比如“在 Word 中打开”)。像application/vnd.mspowerpoint
这样的类型可以让用户选择自动在幻灯片软件中打开这样的文件。
MIME 嗅探
在缺失 MIME 类型或客户端认为文件设置了错误的 MIME 类型时,浏览器可能会通过查看资源来进行 MIME 嗅探。
浏览器不允许定义默认行为(比如“在 Word 中打开”)。像 application/vnd.mspowerpoint
这样的类型可以让用户选择自动在幻灯片软件中打开这样的文件。
MIME 嗅探
在缺失 MIME 类型或客户端认为文件设置了错误的 MIME 类型时,浏览器可能会通过查看资源来进行 MIME 嗅探。
每一个浏览器在不同的情况下会执行不同的操作。(例如,Safari 会在发送的 MIME 类型不合适时查看文件的扩展名。)由于某些 MIME 类型可能代表可执行内容,会存在一些安全问题。服务器可以通过发送 X-Content-Type-Options
标头来阻止 MIME 嗅探。