跳到正文
效率工具实用笔记关于本站
浏览器工具

文件扩展名不等于内容类型:认识MIME类型

约 8 分钟阅读AI 辅助整理

文件后缀只是文件名的一部分,浏览器主要靠服务器返回的MIME类型决定怎么处理内容。本文按MDN资料说明MIME类型的结构、常见类型、octet-stream的含义,以及为什么改后缀不能转换格式。

本文要点

  1. 下面这些是MDN列出的、对网页开发比较常用的类型

  2. 如果你在响应里看到某条请求的 Content-Type 是 application/octet-stream,先别急着判断文件坏了

文件扩展名不等于内容类型:认识MIME类型的知识要点示意图
依据已审核正文摘取要点制作的示意图,非实物照片;请结合正文中的条件与范围阅读。要点摘自已审核正文;完整条件与说明见正文。查看高清图解 ↗
本文目录

先回答:后缀是文件名的一段字符,MIME类型由服务器在响应里给出

如果你把一个文本文件改名为 .jpg,后缀变了,但文件里的内容一个字节都没变。

按MDN的说明,媒体类型(也常称为MIME类型)是一种标准,用来表示文档、文件或一组数据的性质和格式,由IETF的RFC 6838定义和标准化。浏览器通常使用MIME类型而不是文件扩展名来决定如何处理URL,因此服务器在Content-Type响应标头中写对MIME类型很重要。

这句话可以拆成两层。第一层:后缀是文件名里的一段字符,谁都可以改。第二层:MIME类型是服务器在响应里给出的说明,浏览器读的是它。两者可能一致,也可能不一致。

MDN还给出了配置不正确的后果:浏览器可能会曲解文件内容,网站将无法正常工作,下载的文件也可能被错误处理。

适用范围:本文只讲MDN资料中MIME类型的结构、常见类型、octet-stream的含义,以及改后缀为什么不能转换格式。不涉及服务器配置修改,也不声称改后缀能转换文件格式。

MIME类型的写法:类型斜杠子类型,可带参数

MIME类型的基本结构只有两段,中间用斜杠分隔,斜杠两边没有空白字符:

type/subtype

斜杠前面是类型,代表数据所属的大致分类,例如 video 或 text。斜杠后面是子类型,说明具体是哪种数据。以 text 类型为例,子类型包括 plain(纯文本)、html(HTML源代码)、calender(iCalendar/.ics文件)。

类型和子类型必须成对出现,缺一不可。

在子类型后面还可以加可选参数,写法是分号加参数名等号参数值:

type/subtype;parameter=value

例如,对于主类型为 text 的任何MIME类型,可以添加可选的 charset 参数来指定字符集。如果没有指定 charset,默认值为 ASCII(US-ASCII),除非被用户代理的设置覆盖。要表示UTF-8编码的纯文本,写成 text/plain;charset=UTF-8。

两个容易记错的点:MIME类型对大小写不敏感,但传统写法都是小写;参数值可以是大小写敏感的。所以 text/plain 和 TEXT/PLAIN 等价,但参数值里的字符不要随意改大小写。

常见类型对照:文本、图片、二进制默认值各是什么

下面这些是MDN列出的、对网页开发比较常用的类型。读法上先看类型,再看子类型。

文本类:

- text/plain:文本文件的默认值。即使它其实意味着未知的文本文件,浏览器也认为可以直接展示。

- text/html:所有HTML内容都应使用这个类型。

- text/css:在网页中要被解析为CSS的任何CSS文件必须指定这个类型。

- text/javascript:按IANA媒体类型注册表、RFC 9239和HTML规范,JavaScript内容应始终使用这个类型。

图片类:

- image/apng、image/avif、image/gif、image/jpeg、image/png、image/svg+xml、image/webp。

二进制默认值:

- application/octet-stream:二进制文件的默认值。由于它意味着未知的二进制文件,浏览器一般不会自动执行或询问执行,而是把它当作 Content-Disposition 被设为 attachment 一样,弹出“另存为”对话框。

这里有一个初学者常踩的点:text/plain 并不意味“任何种类的文本数据”。MDN的备注举了一个例子:如果从声明CSS文件的 link 元素中下载了一个 text/plain 文件,浏览器不会把它识别为有效的CSS文件。CSS MIME类型需要使用 text/css。

看到 application/octet-stream 时怎么理解

如果你在响应里看到某条请求的 Content-Type 是 application/octet-stream,先别急着判断文件坏了。

按MDN的说明,这是二进制文件的默认值,意味着未知的二进制文件。浏览器一般不会自动执行或询问执行,而是把它当作 Content-Disposition 被设为 attachment 一样,弹出“另存为”对话框。

MDN还提到,很多Web服务器使用默认的 application/octet-stream 来发送未知类型,并列出几种常见的配置错误情况:

- RAR压缩文件。理想状态是设置真实的编码文件类型,但这通常不可能,因为 .RAR 文件可能包含多种不同类型的资源。这种情况,将所发送文件的MIME类型配置为 application/x-rar-compressed。

- 音频或视频文件。只有正确设置了MIME类型的文件才能被 video 或 audio 元素识别和播放。

- 专有文件类型。避免使用 application/octet-stream,对于这种一般的MIME类型浏览器不允许定义默认行为。像 application/vnd.mspowerpoint 这样的类型可以让用户选择自动在幻灯片软件中打开。

对初学者来说,这一节能得出的判断是:看到 application/octet-stream,说明服务器没有给出更具体的类型,浏览器因此按“未知二进制”处理。它不说明文件内容一定有问题,也不说明改个后缀就能让它变成可播放的媒体。

改后缀为什么不能转换格式:三条传送类型信息的方式

MIME类型不是传达文档类型信息的唯一方式。MDN列出了另外两种:

第一,名称后缀。有时会使用名称后缀,特别是在Microsoft Windows系统上。但并非所有操作系统都认为这些后缀有意义(特别是Linux和Mac OS),并且像外部MIME类型一样,不能保证它们是正确的。

第二,魔数(magic number)。不同类型的文件的语法通过查看结构来允许文件类型推断。例如,每个GIF文件以 47 49 46 38 39 十六进制值(GIF89)开头,每个PNG文件以 89 50 4E 47(.PNG)开头。并非所有类型的文件都有魔数,所以这也不是100%可靠的方式。

把这两点放在一起看,就能回答“改后缀能不能转换格式”:后缀只是文件名里的一段字符,改它不会改变文件内部的结构,也不会改变服务器返回的MIME类型。所以把 .txt 改成 .jpg,文件内容还是原来的文本。

本文不声称改后缀能转换格式,也不教用改后缀绕过任何限制。

MIME嗅探与 X-Content-Type-Options:为什么类型写错会有安全问题

在缺失MIME类型、或客户端认为文件设置了错误的MIME类型时,浏览器可能会通过查看资源来进行MIME嗅探。

MDN的说明是:每一个浏览器在不同的情况下会执行不同的操作,例如Safari会在发送的MIME类型不合适时查看文件的扩展名。由于某些MIME类型可能代表可执行内容,会存在一些安全问题。服务器可以通过发送 X-Content-Type-Options 标头来阻止MIME嗅探。

这一节对初学者有用的判断是:MIME类型写错不只是“显示不好看”的问题,MDN把嗅探和“某些MIME类型可能代表可执行内容”放在一起说明,指出这会带来安全问题,所以服务器端写对 Content-Type 是有意义的。

本文只说明MDN资料里关于嗅探和 X-Content-Type-Options 的表述,不提供服务器配置步骤,也不声称某个具体网站存在嗅探问题。

观看知识要点视频 18 秒

18秒无旁白要点导览,文字来自已审核正文;完整步骤、条件及参考资料见下方。

参考资料

以下原始资料提供本文依据;请结合日期、适用条件和产品说明查阅。

请结合原始资料的适用条件阅读。

返回浏览器工具 →