MIME 类型对照表
MIME 类型(Multipurpose Internet Mail Extensions)是互联网标准中用于标识文件内容类型的标识符,在 HTTP 的 Content-Type 头部中使用。
原理解析
MIME 类型(媒体类型)写成 type/subtype,描述数据的「种类」:text/plain、image/png、application/json、application/pdf。它脱离具体文件扩展名,是系统间协商格式的通用语言。
MIME 用于 HTTP 的 Content-Type、邮件的附件标识、以及操作系统按扩展名→类型的查找表(如 /etc/mime.types)。通配 application/octet-stream 表示「未知二进制」,text/plain 常用于兜底文本。
实务上最省事的策略是维护一张显式映射表而不是依赖服务器的默认推断:推断逻辑各实现不同,同一个 .woff2 在不同服务器上可能返回 font/woff2、application/font-woff 甚至 application/octet-stream,而后者会被浏览器直接拒绝。表中未命中的类型统一兜底到 application/octet-stream 并配 attachment 头,这样至少行为是确定的(下载而非静默失败),比让浏览器猜测更好排查。
另一个容易忽略的点是静态资源与接口的类型往往不同:同一个 JSON,作为接口响应时用 application/json,作为静态文件放在 public 目录时有些服务器仍会按扩展名推断为 application/json,而构建产物又可能被加上 .br/.gz 后缀使推断失效。因此静态资源的类型最好由构建或服务器配置显式指定,不要依赖「按扩展名猜」这条看似省事的路径。
什么时候该查这张表
这张表在你要给一个文件类型确定「服务端该声明什么 Content-Type」时有用。MIME 类型是文件格式与 HTTP/邮件/资源加载之间的通用标识,猜错会导致样式不加载、字体被拒、脚本被拦。
不该查的情况:你在设计前端上传校验。浏览器的 accept 属性与拖拽校验只做第一道过滤,真正的类型判断必须读文件魔数(magic number)或交给服务端,因为扩展名和客户端声明都可以随意伪造。
判断标准:如果你在写响应头或 <link>/<script>/<img> 的 type 属性、或者在配 CDN 的 Content-Type 映射,查这张表;如果你在校验用户上传的文件内容是否合法,本表帮不上忙——那要看字节头。
特别注意带 +xml、+json 变体的现代类型(application/ld+json、image/svg+xml、application/wasm)以及已废弃的 application/x-javascript:多数老服务器还在发后者,导致 ES module 被以 classic script 加载而静默失败。
边界与常见陷阱
IANA 是正式注册表,但「已注册」不等于「浏览器认识」
IANA 维护的完整类型列表有上千条,其中大量是历史遗留或极冷门格式(vnd.* 系列尤其多)。浏览器支持的是子集:很多新类型(如 font/woff2 在早期、application/avif)需要一定内核版本才被接受。给一个冷门类型时,正确的兜底是 application/octet-stream 加 Content-Disposition,而不是发一个浏览器不识别的类型让下载行为变得不可预测。
SVG 带脚本,能被用作 XSS 载体
image/svg+xml 是文本格式,能内嵌 <script>、onload 属性与外链引用。把用户上传的 SVG 以 image/svg+xml 直接内联渲染,等于执行用户代码。安全做法是用 <img src> 引用(浏览器会沙箱化,不执行脚本),或以 image/png 输出;若必须内联,则需配合 CSP sandbox 与严格清洗。
JavaScript 的 MIME 历史遗留坑仍在生效
application/javascript 与 text/javascript 都已废弃,正确类型是 text/javascript;同时 application/x-javascript 是过时写法。真正的代价在于严格 MIME 检查:当脚本以错误的类型(如 text/plain)返回时,浏览器会直接拒绝执行并报「拒绝执行脚本」。这个症状常被误判为语法错误,实际只要看浏览器控制台的 MIME 报错就能定位。
字体类型被拒是 CORS 而非 MIME 问题
@font-face 加载失败最常见的原因是字体文件跨域且服务端没带 Access-Control-Allow-Origin,浏览器控制台报的是 CORS 策略错误而不是 MIME 错误。类型写对了但仍然不加载时,去查响应头里的 Access-Control-Control-Origin,而不是继续改 font MIME。
与相邻内容的分工
要查「HTTP 请求与响应里 Content-Type 头怎么用」,用站内「HTTP Content-Type」页;本页覆盖的是文件类型到 MIME 的映射与消费端行为。
判断上传文件真伪要读魔数,本表不提供字节签名;本站的文件类型检测类工具走的是另一条路径。
字符集与编码名(GBK、Shift-JIS、UTF-8 等)属于站内「字符编码」页,MIME 表里的 charset 参数只引用它。
需要查看某个 JSON 响应的实际内容,用站内 JSON 格式化工具;本页不解析请求体。
实战片段
要点:① 脚本用 text/javascript(application/javascript 与 application/x-javascript 已废弃),类型错了浏览器会直接拒绝执行而非降级;② 未知类型兜底 application/octet-stream 并配 Content-Disposition: attachment,别让浏览器自行猜测;③ 用户 SVG 一律用 <img src> 引用——它不执行内嵌脚本,而内联渲染 image/svg+xml 等于执行上传者提交的代码。
// 静态服务:用扩展名 → MIME 映射,未命中时兜底而不是猜
import { extname } from 'node:path'
const MIME: Record<string, string> = {
'.html': 'text/html; charset=utf-8',
'.js': 'text/javascript; charset=utf-8', // 不用 application/javascript
'.css': 'text/css; charset=utf-8',
'.json': 'application/json; charset=utf-8',
'.svg': 'image/svg+xml',
'.webp': 'image/webp',
'.woff2': 'font/woff2',
'.wasm': 'application/wasm',
}
function contentTypeOf(file: string): string {
const ext = extname(file).toLowerCase()
// 未知类型 → 二进制 + 强制下载,避免浏览器猜测行为
return MIME[ext] ?? 'application/octet-stream'
}
// 用户上传的 SVG:永远用 <img src> 引用,不内联渲染(内联等于执行上传者的脚本)
实践注解
- text/javascript 与 application/javascript 的 X-Content-Type-Options 保护现代浏览器把两者都当脚本执行,但如果 Content-Type 写错(例如 text/plain)且没有 X-Content-Type-Options: nosniff,旧版 IE 会「嗅探」成脚本执行,构成 XSS 面。静态资源服务一律显式给类型并加 nosniff。
- application/octet-stream 是「强制下载」的兜底凡是识别不出类型、或不想让浏览器内联渲染的资源(如用户上传的文件),都该返回它并配 Content-Disposition: attachment。反过来,把 .html/.svg 误配成 octet-stream 会让页面直接变成下载。
- 字体与 SVG 的 MIME 配错会静默失效woff2 必须是 font/woff2,SVG 必须是 image/svg+xml。配错时浏览器不会报网络错误,只在控制台留一条 OTS parsing error 或干脆不显示字形,排查成本很高。
数据来源
- IANA Media Types Registry
- RFC 6838 (media type registration procedures)
上述编号、名称与定义均来自公开规范,本站不主张对规范数据本身的独创性;本页的编排方式、中文释义与实践注解由本站撰写。
| MIME Type | 扩展名 | 分类 | 说明 |
|---|---|---|---|
| text/html | .html | Text | HTML 文档 |
| text/css | .css | Text | CSS 样式表 |
| text/javascript | .js | Text | JavaScript 脚本 |
| text/plain | .txt | Text | 纯文本 |
| text/xml | .xml | Text | XML 文档 |
| text/csv | .csv | Text | CSV 逗号分隔值 |
| text/markdown | .md | Text | Markdown 文档 |
| application/json | .json | Application | JSON 数据 |
| application/xml | .xml | Application | XML 数据 |
| application/pdf | Application | PDF 文档 | |
| application/zip | .zip | Application | ZIP 压缩包 |
| application/gzip | .gz | Application | Gzip 压缩文件 |
| application/x-tar | .tar | Application | Tar 归档文件 |
| application/octet-stream | .bin | Application | 二进制数据流 |
| application/x-www-form-urlencoded | - | Application | 表单编码数据 |
| multipart/form-data | - | Application | 多部分表单数据(文件上传) |
| image/jpeg | .jpg | Image | JPEG 图片 |
| image/png | .png | Image | PNG 图片 |
| image/gif | .gif | Image | GIF 动图 |
| image/svg+xml | .svg | Image | SVG 矢量图 |
| image/webp | .webp | Image | WebP 图片 |
| image/x-icon | .ico | Image | 图标文件 |
| image/bmp | .bmp | Image | BMP 位图 |
| audio/mpeg | .mp3 | Audio | MP3 音频 |
| audio/wav | .wav | Audio | WAV 音频 |
| audio/ogg | .ogg | Audio | OGG 音频 |
| audio/aac | .aac | Audio | AAC 音频 |
| video/mp4 | .mp4 | Video | MP4 视频 |
| video/webm | .webm | Video | WebM 视频 |
| video/x-msvideo | .avi | Video | AVI 视频 |
| font/woff | .woff | Font | WOFF 字体 |
| font/woff2 | .woff2 | Font | WOFF2 字体 |
| font/ttf | .ttf | Font | TrueType 字体 |
| font/otf | .otf | Font | OpenType 字体 |
常见问题
什么是 MIME 类型?
MIME 类型(Content-Type)标识文件或数据的格式,由"类型/子类型"组成(如 text/html),服务器通过 HTTP 响应头告知浏览器如何解析。
扩展名和 MIME 类型必须一致吗?
不一定。浏览器以 Content-Type 响应头为准,扩展名只是约定。配置错误可能导致被下载或安全拦截。
文件上传该用哪个 MIME?
含文件的表单使用 multipart/form-data;纯键值表单使用 application/x-www-form-urlencoded。
如何查看资源的 MIME 类型?
在浏览器开发者工具的 Network 面板查看响应头 Content-Type,或用本站的请求/响应解析相关工具核对。