【HTTP完全注解】不为人知的MIME类型

想要了解更多HTTP相关内容请关注该专栏:《HTTP完全注解》

完整手册可关注该仓库,如有帮助,麻烦给个✨

该站点也会同步更新,已满足PWA,您可安装到桌面随时/离线访问

MIME类型

MIME类型,也被称为媒体类型,用于表示HTTP传输的内容的类型,以便客户端或服务端正确处理解析传输的数据 。MIME类型通常在HTTP标头中的 Content-Type字段中进行指定,例如下面的示例,如果要传输HTML文档,Content-Type头可能会设置为"text/html"。

此时可能有好奇的小伙伴会问:"文件名后缀就能够表达文件类型了,为什么HTTP还需要MIME类型呢? ",确实文件后缀在特定的操作系统语境中能够清晰的表达文件类型,但在不同的操作系统中文件名后缀所表达的文件类型却有所不同,有些操作系统甚至没有文件名后缀,而MIME类型是跨平台和跨系统的标准,它能够确保文件在不同的网络环境/平台/操作系统中以预期的方式被处理和识别

MIME类型的结构

MIME 类型通常包含三个部分内容:类型(type)、子类型(subtype)、以及一个可选的参数(parameter=value),类型与子类型中间由斜杠 / 分割,而可选参数则使用 分割,中间没有空白字符。

http 复制代码
type/subtype;parameter=value
  • 类型(type) :代表数据类型所属的大致分类,例如:视频数据的类型为 video ,文本数据的类型为 text
  • 子类型(subtype) :代表更确切的数据类型,以 text 类型为例,它的子类型包括:plain(纯文本)、html(HTML源代码)、calender(iCalendar/.ics文件)。
  • 可选的参数(parameter=value) :提供额外的信息,例如 text 类型,可以添加可选的 charset 参数(charset=utf-8),以指定数据中的字符所使用的字符集。

类型(type)的分类

类型分为了单一类型与多部分类型。

单一类型

单一类型代表单一文件或媒介,比如一段文字、一个音乐文件、一个视频文件等, 单一类型示例:

http 复制代码
Content-Type:text/html

IANA 目前注册的单一类型如下:

类型(type) 描述
audio 音频或音乐数据。常见MIME类型如 audio/mpegaudio/vorbis
font 字体/字型数据。常见MIME类型如 font/wofffont/ttffont/otf
image 图像或图形数据,包括位图和矢量静态图像,以及静态图像格式的动画版本,如GIF 动画或 APNG。常见MIME类型如 image/jpegimage/pngimage/svg+xml
text 纯文本数据,包括任何人类可读内容、源代码或文本数据------如逗号分隔值(comma-separated value,即 CSV)格式的数据。示例包含:text/plaintext/csvtext/html
video 视频数据或文件,例如 MP4 电影(video/mp4)。
example 在演示如何使用 MIME 类型的示例中用作占位符的保留类型。这一类型永远不应在示例代码或文档外使用。example 也可以作为子类型。例如,在一个处理音频有关的示例中,MIME 类型 audio/example 表示该类型是一个占位符,且在实际使用这段代码时,此处应当被替换成适当的类型。
application 不明确属于其他类型之一的任何二进制数据;要么是将以某种方式执行或解释的数据,要么是需要借助某个或某类特定应用程序来使用的二进制数据。通用二进制数据(或真实类型未知的二进制数据)是 application/octet-stream。其他常用的示例包含 application/pdfapplication/pkcs8application/zip

多部分类型

而多部分类型,可以代表由多个部件(比如多段文字、多个音乐文件、多个视频文件等)组合成的文档,其中每个部分都可能有各自的单一类型的 MIME 类型;此外,也可以代表多个文件被封装在单次事务中一同发送,多部分类型示例:

http 复制代码
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 // 分隔符

IANA 目前注册的多部分类型如下:

类型(type) 描述
multipart 由多个组件组成的数据,这些组件可能各自具有不同的 MIME 类型。例如,multipart/form-data(用于使用 FormData API 生成的数据)和 multipart/byteranges(定义于 RFC 7233, section 5.4.1,当获取到的数据仅为部分内容时------如使用 Range 标头传输的内容------与返回的 HTTP 响应 206 "Partial Content"组合使用)。
message 该类型通常用于表示电子邮件的消息体。例如,这可以用来表示将转发信息作为其数据一部分的电子邮件,或将超大信息分块发送,就像发送多条信息一样。例如,message/rfc822(用于转发或回复信息的引用)和 message/partial(允许将大段信息自动拆分成小段,由收件人重新组装)是两个常见的例子。

常见的MIME类型

文本类型(text)

MIME 类型为 text 的文件包含文本数据。子类型指定数据所代表的具体文本文件格式。

子类型(subtext) 完整示例 描述
plain text/plain 这是文本文件的默认值。即使它其实意味着未知的文本文件,但浏览器认为是可以直接展示的。
css text/css 在网页中要被解析为 CSS 的 CSS 文件必须 指定 MIME 为 text/css。通常,如果服务器不识别 CSS 文件的 .css 后缀,则可能将它们以 MIME 为 text/plainapplication/octet-stream 来发送给浏览器:在这种情况下,大多数浏览器不将其识别为 CSS 文件而直接忽略。
html text/html 与css同理,所有的 HTML 内容都应该使用这种类型。
javascript text/javascript JavaScript 内容应始终使用 MIME 类型 text/javascript 提供,使用除 text/javascript 以外的任何 MIME 类型都可能导致脚本无法加载或运行。你可能会发现某些 JavaScript 内容在 MIME 类型中错误地使用了 charset 参数,以指定脚本内容的字符集。对于 JavaScript 内容来说,charset 参数无效,在大多数情况下会导致脚本加载失败。

图片类型(image)

MIME 类型为 image 的文件包含图像数据。子类型指定数据所代表的具体图像文件格式。

子类型(subtext) 完整示例 描述
jpeg image/jpeg 表明图片格式为JPEG(Joint Photographic Experts Group,联合图像专家组),JPEG采用有损压缩,其压缩比率是可调的,可以从轻微压缩到极端压缩,这取决于所需的图像质量和文件大小,它不支持透明度,不支持动画,适用于允许图像质量损失但大小尽可能小的情况。
png image/png 表明图片格式为PNG(Portable Network Graphics,便携式网络图形),PNG采用无损压缩(压缩比率:30%-60%左右),支持透明度,不支持动画,尤其适用于需要高质量图像和透明背景的场景。
gif image/gif 表明图片格式为GIF(Graphics Interchange Format,图形互换格式),GIF是一种位图图像格式,支持透明度,支持动画,GIF使用的是无损压缩技术,但它限制了颜色深度为256色,这可能会导致颜色信息的损失。因此,尽管压缩本身是无损的,色彩限制可能导致视觉上的质量降低,适用于图像质量要求低的简单动画图像的场景。
avif image/avif 表明图片格式为AVIF(AV1 Image File Format,AV1图像文件格式),AVIF可采用无损/有损压缩(压缩比率:20%-50%左右),支持透明度,支持动画,该格式具有更好的压缩效率,在保持图像质量的同时可以实现更小的文件大小,但由于是较新的格式,它的支持和普及程度可能不如其他更成熟的格式。
webp image/webp 表明图片格式为webp(Web Picture,网页图片),webp可采用无损或有损压缩(压缩比率:20%-50%左右),支持透明度,支持动画,由于其出色的压缩性能和良好的图像质量,WebP在网页设计和移动应用程序中得到了广泛的应用。
svg+xml image/svg+xml 表明图片格式为SVG(Scalable Vector Graphics,可缩放矢量图形),SVG是一种基于XML(可扩展标记语言)的图像标准,用于描述二维矢量图形。与位图图像(如JPEG、PNG)不同,SVG图像是基于数学方程和几何形状的矢量图形,因此可以无损地缩放到不同的大小而不失真,因此它常用于Web开发中,特别适用于需要在不同分辨率和设备上保持图像质量的情况。

字体类型(font)

MIME 类型为 font 的文件包含字体数据。子类型指定数据所代表的具体字体文件格式。

子类型(subtext) 完整示例 描述
ttf font/ttf 表明字体格式为TTF(TrueType Font, 真类型字体)。TrueType 是一种矢量字体技术,能够以可伸缩的方式呈现字符,这使得文本在不同大小和分辨率下都能保持清晰。由于其广泛的兼容性和高质量的文本呈现能力,TrueType 字体被广泛应用于各种操作系统和应用程序中。
opentype font/opentype 表明字体格式为OTF(OpenType Font, 开放类型字体)。OpenType 字体是一种在 TrueType 和 PostScript 字体技术基础上发展的格式,它支持更广泛的字符集、更多样化的字形变体、以及先进的排版功能。OpenType 字体因其强大的功能和对国际语言的支持而被广泛应用于数字设计、印刷和网络排版领域。
woff font/woff 表明字体格式为WOFF(Web Open Font Format, Web开放字体格式)。WOFF 是专为Web设计的字体格式,它通过有效的压缩机制减小文件大小,加快网页加载速度。此格式支持字体的子集化和元数据的添加,使得字体在网络上的传输和使用更加高效。WOFF 字体因其网络友好性和广泛的浏览器支持而在Web开发中被广泛使用。
woff2 font/woff2 表明字体格式为WOFF2(Web Open Font Format 2.0, Web开放字体格式2.0),WOFF2 是 WOFF 的优化版本,提供了更高的压缩效率。WOFF2 通过先进的压缩算法显著减小了字体文件的大小,同时保持了字体的高质量。它在Web开发中被推荐使用,因为它结合了出色的压缩能力和广泛的浏览器支持。
eot font/eot 表明字体格式为EOT(Embedded OpenType, 嵌入式开放类型字体)。EOT 是专为微软的Internet Explorer浏览器设计的字体格式。它支持字体的嵌入和保护,以便在Web页面中有效使用。尽管EOT 提供了一些专有特性,但由于现代浏览器普遍支持更通用的字体格式(如TTF、OTF、WOFF等),EOT 的使用在现代Web开发中变得较为有限。

音频类型(audio)

MIME 类型为 audio 的文件包含音频数据。子类型指定数据所代表的具体音频文件格式。

子类型(subtext) 完整示例 描述
wav audio/wav 表明音频格式为WAV(Waveform Audio File Format,波形音频文件格式)。WAV 通常使用未压缩的线性PCM格式,因此保留了原始音频数据的高质量。这种格式的文件通常较大,适用于专业音频编辑和音乐制作。常见的MIME类型还包括audio/wave、audio/x-wav、audio/x-pn-wav。
flac audio/flac 表明音频格式为FLAC(Free Lossless Audio Codec,免费无损音频编解码器)。FLAC 采用无损压缩技术,可以在不损失音质的前提下减小文件大小(压缩率约为50%-70%),适用于音乐爱好者和音频专业人士,希望在保持高音质的同时节省存储空间。
ogg audio/ogg 表明音频格式为OGG(Ogg Vorbis)。Ogg Vorbis是一种有损压缩格式,以优秀的压缩效率和音质著称(压缩率约为45%-85%)。它是一个开源格式,通常用于流媒体应用和游戏音频,提供高质量的音频输出和较小的文件大小。
aac audio/aac 表明音频格式为AAC(Advanced Audio Coding,高级音频编码)。AAC 是一种有损压缩技术,以更高的音频质量和更低的比特率相比MP3著称(压缩率约为10%-15%)。它被广泛用于数字音频广播、音乐存储和在线流媒体等领域,也是MPEG-4标准的一部分。
mpeg audio/mpeg 表明音频格式为MPEG(Moving Picture Experts Group,视频图像专家组),即MP3。MP3是一种有损音频压缩格式,广泛用于音乐存储和传输,因其出色的压缩效率和广泛的兼容性而深受欢迎。MPEG-1 Layer 3 (MP3)专门针对音频压缩,优化了在保持可接受音质的同时减小文件大小。
wma audio/wma 表明音频格式为WMA(Windows Media Audio,Windows媒体音频)。WMA是由Microsoft开发的一种有损压缩格式,旨在优化音频质量和文件大小的平衡。它通常用于Windows平台上的音乐存储和流媒体服务,与Windows Media Player等微软产品兼容。
webm audio/webm 表明音频格式为WebM(WebM Audio)。WebM是一种有损压缩技术,它能够在较低的比特率下提供高质量的音频体验,实现高视频质量和小文件大小之间的最佳平衡,由于其高效的压缩能力和对网络流媒体友好的特性,WebM格式在在线视频平台和其他网络媒体应用中得到了广泛的应用。

视频类型(video)

MIME 类型为 video 的文件包含视频数据,子类型指定数据所代表的具体视频文件格式。

子类型(subtext) 完整示例 描述
mp4 video/mp4 表明视频格式为MP4(MPEG-4 Part 14),使用有损压缩技术,压缩比率因编码器和设置而异,但通常能提供高压缩效率。支持视频、音频流、字幕等,广泛应用于网络传输和播放设备,适合平衡高质量和文件大小。
webm video/webm 表明视频格式为WebM,采用VP8或VP9视频编码和Vorbis或Opus音频编码。WebM的压缩比率较高,尤其是采用VP9时,更适合于在线视频,为网络流媒体和视频服务优化,以减少文件大小并保持高质量视频输出。
ogg video/ogg 表明视频格式为Ogg。使用Theora视频编码,是一种开源的有损视频压缩技术。Ogg格式的压缩比率良好,适用于确保开放标准和避免专利费用的应用场景。
avi video/x-msvideo 表明视频格式为AVI(Audio Video Interleave)。AVI格式支持多种编码方法,包括无损和有损压缩,压缩比率取决于使用的具体编码器。虽然AVI文件可以较大,但它提供了良好的兼容性和简单的视频编辑功能。
quicktime video/quicktime 表明视频格式为QuickTime,由苹果公司开发。支持多种类型的数字视频和音频数据压缩,压缩比率取决于所选编解码器。QuickTime格式适用于高质量视频的制作和编辑。
mpeg video/mpeg 表明视频格式为MPEG(Moving Picture Experts Group)。MPEG定义了包括MPEG-1和MPEG-2的视频压缩标准,提供了高压缩比率,优化了高质量视频的存储和传输,广泛应用于电视广播和DVD。

二进制数据类型(application)

MIME 类型为 application 表明不明确属于其他类型之一的任何二进制数据,子类型表明是哪一种二进制数据。

子类型(subtext) 完整示例 描述
octet-stream application/octet-stream 这是一种默认的MIME类型,用于表示这是未知类型的二进制数据,通常用于下载或上传未知类型的文件。
json application/json 表明二进制数据为JSON(JavaScript Object Notation,JavaScript 对象表示法),JSON用于表示结构化数据。它广泛用于网络应用程序中,作为数据交换的标准格式。
x-www-form-urlencoded application/x-www-form-urlencoded 这是HTML表单提交时使用的默认编码类型,该类型会将表单数据编码成一个查询字符串格式的消息体,具体编码方式如下: 1.空格转换为加号(+) :表单数据中的空格字符会被替换为加号。 2.特殊字符转换为百分比编码 :非字母数字字符会被转换成 % 后跟两位十六进制数, 3.键值对 :表单中的每个字段(键)和其对应值使用等号(=)连接。 4.字段分隔 :多个键值对之间使用 & 符号分隔。
xml application/xml 表明二进制数据为XML文件
xhtml+xml application/xhtml+xml 表明二进制数据为XHTML文件
javascript application/javascript 表明二进制数据为javascript文件
pdf application/pdf 表明二进制数据为PDF文件
zip application/zip 表明二进制数据为ZIP压缩文件
msword application/msword 用于Microsoft Word文档的文件格式。虽然现在常见的是.docx格式(application/vnd.openxmlformats-officedocument.wordprocessingml.document),但.doc仍然广泛使用
vnd.ms-excel application/vnd.ms-excel 用于Microsoft Excel表格的文件格式。虽然现在常见的是.xlsx格式(application/vnd.openxmlformats-officedocument.spreadsheetml.sheet),但.xls仍然广泛使用
vnd.ms-powerpoint application/vnd.ms-powerpoint 用于Microsoft PowerPoint演示文稿的文件格式。虽然现在常见的是.pptx格式(application/vnd.openxmlformats-officedocument.presentationml.presentation),但.ptt仍然广泛使用
event-stream application/event-stream event-stream是一个特定的 MIME 类型,用于服务器发送事件(SSE,Server-Sent Events)。

多部分数据类型(multipart)

子类型(subtext) 完整示例 描述
form-data multipart/form-data; boundary=指定分割符 multipart/form-data 可用于 HTML 表单从浏览器发送信息给服务器。
byteranges multipart/byteranges; boundary=指定分割符 multipart/byteranges 用于把部分的响应报文发送回客户端。

正确设置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嗅探。

每个浏览器会使用不同的方式来确认资源的类型:

  • Chrome : 它会检查文件的内容,尤其是当服务器发送的MIME类型是未知或通用类型(如application/octet-stream)时。如果嗅探结果与服务器声明的MIME类型不一致,Chrome可能会根据嗅探结果处理文件。
  • Edge: 对于基于Chromium的Edge浏览器,其MIME嗅探策略与Chrome类似,会尝试分析文件内容来确定其类型。
  • Opera: 作为基于Chromium的浏览器,Opera在MIME嗅探方面的策略也与Chrome相似,它会检查文件内容来决定如何处理文件。
  • Firefox: 它更倾向于信任服务器声明的MIME类型。在某些情况下,如果文件的内容明显与服务器声明的类型不符,Firefox会采取嗅探结果。
  • Safari: Safari的MIME嗅探行为较为独特,它有时会依赖于文件的扩展名来决定如何处理文件,尤其是在服务器提供的MIME类型不明确时。

MIME嗅探虽然能够帮我们正确呈现/处理未知类型的资源,但也带来了许多安全风险:

  • 错误解释可执行内容: 浏览器可能将非执行文件(如图像或视频)误判为可执行脚本(如HTML或JavaScript)。这种情况下,一个恶意文件可以被错误地执行,导致跨站脚本攻击(XSS)或其他安全威胁。
  • 基于MIME类型的攻击: 攻击者可能利用MIME嗅探机制来绕过安全检查。例如,他们可以上传一个带有恶意代码的文件,该文件伪装成一个无害的类型(如图像),但实际上包含可执行的脚本。
  • 内容安全策略绕过: MIME嗅探可能允许攻击者绕过某些内容安全策略(CSP),这些策略通常用于限制网页上可以执行哪些类型的内容。

为了减轻这些风险,我们可以通过在HTTP响应头中设置X-Content-Type-Options: nosniff告诉浏览器不要对资源进行MIME嗅探。

其他传送文件类型的方法

  • 有时会使用名称后缀,特别是在 Microsoft Windows 系统上。并非所有的操作系统都认为这些后缀是有意义的(特别是 Linux 和 Mac OS),并且像外部 MIME 类型一样,不能保证它们是正确的。
  • 魔数(magic number)。不同类型的文件的语法通过查看结构来允许文件类型推断。例如,每个 GIF 文件以 47 49 46 38 39 十六进制值(GIF89)开头,每个 PNG 文件以 89 50 4E 47.PNG)开头。并非所有类型的文件都有魔数,所以这也不是 100% 可靠的方式。

相关标头

X-Content-Type-Options响应标头

响应标头X-Content-Type-Options指定客户端禁用MIME嗅探行为。

参数

该响应标头并无其他参数。

取值

  • nosniff

    指定客户端禁用MIME嗅探行为

示例

http 复制代码
X-Content-Type-Options: nosniff

本节参考

转载需要经过本人同意,并标明出处!

相关推荐
gywl1 小时前
openEuler VM虚拟机操作(期末考试)
linux·服务器·网络·windows·http·centos
轻口味1 小时前
命名空间与模块化概述
开发语言·前端·javascript
前端小小王2 小时前
React Hooks
前端·javascript·react.js
迷途小码农零零发2 小时前
react中使用ResizeObserver来观察元素的size变化
前端·javascript·react.js
某柚啊2 小时前
Windows开启IIS后依然出现http error 503.the service is unavailable
windows·http
_oP_i2 小时前
HTTP 请求Media typetext/plain application/json text/json区别
网络协议·http·json
娃哈哈哈哈呀2 小时前
vue中的css深度选择器v-deep 配合!important
前端·css·vue.js
旭东怪3 小时前
EasyPoi 使用$fe:模板语法生成Word动态行
java·前端·word
yang_shengy3 小时前
【JavaEE】网络(6)
服务器·网络·http·https