| 扩展名 | MIME 类型 | 说明 | 分类 |
|---|
MIME 类型速查表收录了 453 条常见文件扩展名与 MIME 类型的对应关系,覆盖图片、音频、视频、字体、文档、压缩包、网页、代码、数据、其他共 10 个分类,支持关键词搜索与分类筛选,点一下 MIME 类型即可复制。
jpg)、MIME 类型(如 image/png)或中文说明(如 视频),表格会实时过滤。支持用空格分隔多个关键词,例如 image 无损 表示两个条件同时满足。Esc 键,快速恢复全部记录。表格区高度固定 400px,内容超出时在区域内滚动,表头会吸顶固定,方便边滚边看。
MIME* 是 *Multipurpose Internet Mail Extensions*(多用途互联网邮件扩展)的缩写。它最早诞生于 1990 年代,为了解决一个很具体的问题:*电子邮件最初只能传输纯 ASCII 文本,没法发送图片、音频、Word 文档这些二进制内容。
MIME 的解法是给每一段数据贴上「标签」,说明它到底是什么东西,这个标签就是 MIME 类型*(也叫 **媒体类型 / Media Type**,在 HTTP 里正式名称是 *Content-Type)。后来这套机制被 HTTP 协议沿用,成了浏览器判断「这个文件该怎么处理」的核心依据。
type/subtype; parameter=value
以 text/html; charset=utf-8 为例:
| 部分 | 值 | 含义 |
|---|---|---|
| type(主类型) | text | 大类,共 9 种 |
| subtype(子类型) | html | 具体格式 |
| parameter(参数) | charset=utf-8 | 附加信息,如字符集 |
| 主类型 | 说明 | 典型例子 |
|---|---|---|
text | 人类可读的文本 | text/plain、text/html、text/css |
image | 图片 | image/jpeg、image/png、image/svg+xml |
audio | 音频 | audio/mpeg、audio/ogg |
video | 视频 | video/mp4、video/webm |
application | 应用数据,最常见也最杂 | application/json、application/pdf |
font | 字体 | font/woff2、font/ttf |
model | 3D 模型 | model/gltf+json、model/stl |
multipart | 多部分组合,如表单上传 | multipart/form-data |
message | 消息封装 | message/rfc822(邮件) |
子类型里还有两个约定俗成的后缀:
+xml(基于 XML)和+json(基于 JSON)。比如image/svg+xml、application/ld+json。看到+json就知道它的内容是 JSON 结构。
当浏览器请求一个资源时,服务器会在响应头里带上 Content-Type:
HTTP/1.1 200 OK
Content-Type: image/png
(此处为 PNG 二进制数据)
浏览器的处理逻辑大致是:
text/html、image/*、application/pdf 这类通常直接在页面里渲染;application/octet-stream、application/zip 这类会触发下载。text/html 就走 HTML 解析器,看到 application/json 就走 JSON 解析器。text/javascript 会被当作脚本执行——这也是为什么*错误地返回用户上传文件的 MIME 类型非常危险。早期浏览器有个「贴心」行为叫 MIME 嗅探(MIME sniffing)*:如果服务器返回的 Content-Type 看起来不对,浏览器会自己「猜」内容的真实类型。这导致了一个经典漏洞——攻击者上传一个内容是 HTML 或 JS 的文件,服务器返回 text/plain,浏览器却把它嗅探成 text/html 并执行,形成 *XSS 攻击。
修复方式是让服务器明确告诉浏览器「别猜」:
X-Content-Type-Options: nosniff
加上这个响应头后,浏览器会严格按 Content-Type 处理,不再嗅探。这是每个网站都该配置的安全响应头之一。
application/octet-stream 是万能兜底,但不是好选择不知道类型时,服务器常返回 application/octet-stream(意思是「一堆字节」),浏览器会直接下载。能跑通,但语义上等于放弃治疗——用户拿不到正确的文件名后缀,也失去了内联预览的可能。能确定类型就不要用兜底值。
.ts 到底是谁?.ts 有两个完全不同的含义:
video/mp2t,这是 IANA 注册的标准类型,也是本表采用的值text/ts 或 application/typescript冲突的根源是「扩展名先到先得」。TypeScript 官方文档也承认了这个冲突,建议在配置服务器时按实际用途手动指定。
.js 的 MIME 类型改过好几次JavaScript 的类型经历了 application/javascript → application/x-javascript → 现在 IANA 和 WHATWG 都推荐 text/javascript,主流服务器与 CDN 均已跟进。如果旧代码在判断 JS 类型,记得把这三种都考虑进去。
.md 的官方类型是后来才有的text/markdown 直到 2016 年才正式注册。在此之前大家普遍用 text/x-markdown,甚至干脆用 text/plain。新项目应当使用 text/markdown。
Nginx 的 mime.types、Apache 的 mime.types、IIS 的类型表版本各不相同。像 .webp、.avif、.woff2、.wasm 这些较新的格式,老版本服务器可能不认识,会返回 application/octet-stream。遇到「文件能下载但预览不了」,先查服务器的 MIME 配置。
include /etc/nginx/mime.types;
default_type application/octet-stream;
types {
image/avif avif;
image/webp webp;
font/woff2 woff2;
application/wasm wasm;
}
AddType image/avif .avif
AddType font/woff2 .woff2
AddType application/wasm .wasm
header('Content-Type: application/json; charset=utf-8');
res.type('application/json');
| 概念 | 作用 | 和 MIME 的关系 |
|---|---|---|
Content-Disposition | 控制内联显示还是下载 | 常配合 Content-Type 使用,值为 attachment 时强制下载 |
Accept 请求头 | 客户端声明能接受哪些类型 | 服务器据此做内容协商 |
Content-Encoding | 说明是否用了 gzip / br 压缩 | 与 MIME 是不同维度,别混淆 |
| 文件扩展名 | 文件名后缀 | 只是约定,不决定类型 |
| 文件魔数 | 文件开头的特征字节 | 判断真实类型最可靠的方式 |
一句话记住:扩展名是给人和系统看的「名字」,MIME 类型是给程序看的「身份」,文件魔数才是「DNA」。三者可能不一致,判断类型时应优先信任魔数,其次是 MIME,最后才是扩展名。
.jpg / .jpeg)会分行列出,方便按扩展名直接搜索。.jsx、.vue、.tf),采用社区通行写法,仅作为「约定值」参考,不保证所有服务器都认识。file --mime-type 文件名 查看。MIME 类型和文件扩展名有什么区别?
为什么服务器返回的是 application/octet-stream?
怎么查看一个文件真实的 MIME 类型?
.ts 文件为什么会有歧义?
X-Content-Type-Options: nosniff 这个响应头是干什么的?
为什么我的 webp、avif 图片在浏览器里变成下载了?
上传文件时前端需要手动设置 MIME 类型吗?
MIME 类型能决定文件是否安全吗?
为什么 JavaScript 的 MIME 类型有 text/javascript 和 application/javascript 两种写法?
表里没有我需要的格式怎么办?