常用 MIME 类型
服务器与上传表单依赖这些字符串;类型写错会导致预览失败、下载异常或违反内容安全策略。
| 类别 | MIME | 常见扩展名 |
|---|---|---|
| HTML | text/html | .html |
| CSS | text/css | .css |
| JavaScript | text/javascript | .js |
| JSON | application/json | .json |
| XML | application/xml | .xml |
| Plain text | text/plain | .txt |
| CSV | text/csv | .csv |
| application/pdf | ||
| ZIP | application/zip | .zip |
| PNG | image/png | .png |
| JPEG | image/jpeg | .jpg |
| GIF | image/gif | .gif |
| WebP | image/webp | .webp |
| SVG | image/svg+xml | .svg |
| ICO | image/x-icon | .ico |
| MP3 | audio/mpeg | .mp3 |
| WAV | audio/wav | .wav |
| MP4 | video/mp4 | .mp4 |
| WebM | video/webm | .webm |
| WOFF2 | font/woff2 | .woff2 |
| Form URL-encoded | application/x-www-form-urlencoded | — |
| Multipart form | multipart/form-data | — |
说明
- 浏览器可能嗅探内容,服务端仍应返回正确类型。
- JS 正式类型为 text/javascript(application/javascript 已过时)。
MIME 类型实际控制什么
MIME 类型是服务器附加到响应上的标签,用于告知浏览器这些字节代表什么。text/html 会渲染页面,application/pdf 会打开阅读器,image/svg+xml 可以内联绘制,而 application/octet-stream 会触发下载提示。两个看起来完全相同的文件仅因这一个头部字段就可能表现出截然不同的行为。浏览器、上传表单、邮件客户端以及内容安全策略都会读取它,因此设置错误是预览失效、强制下载和脚本被拦截的常见原因。
text/ 和 application/ 目前的适用范围
旧版建议将 JavaScript 标为 application/javascript;现行标准采用 text/javascript,而 application/javascript 已过时。CSS 为 text/css,HTML 为 text/html,纯文本为 text/plain,CSV 为 text/csv —— 都属于 text/*,因为它们的设计初衷就是供人阅读。结构化格式归入 application/*:如 application/json、application/xml、application/pdf、application/zip。值得注意的是 SVG,尽管它本质上是 XML,但必须以 image/svg+xml 的形式提供,这样浏览器才会渲染它而不是直接下载。
类型错误会破坏上传与安全性
上传文件标注错误是经典的 bug 来源:JSON 文件被标为 text/plain 时可能被 API 客户端拒绝;图片以 octet-stream 返回时会触发下载而非显示;脚本以 text/html 提供则会被浏览器拦截。严格的内容安全策略(CSP)规则会依据 MIME 类型进行判断,因此样式表类型错误时可能直接被拒。当预览或下载行为异常时,检查响应的 Content-Type 通常是速度最快的诊断方法。
字符集与内容嗅探
对于文本类型,MIME 类型需搭配 charset 一起提供 —— 对多语言内容而言,text/html; charset=utf-8 和 application/json; charset=utf-8 是安全默认值。旧版浏览器曾通过内容嗅探(content sniffing)根据文件字节猜测类型,攻击者可借此行恶;发送 X-Content-Type-Options: nosniff 即可告知浏览器信任声明的类型。始终应发送明确且正确的 Content-Type,不要依赖浏览器根本看不到的文件扩展名。
在服务器与表单中设置类型
类型的来源很关键。静态托管平台会自动按扩展名映射,但 Web 框架通常需显式设置 —— 例如在 Express 中使用 res.type('json'),在 Nginx 中通过 types 块配置,在 Cloudflare Pages 上通过响应头或文件扩展名指定。HTML 表单使用 enctype 控制上传编码:文件上传用 multipart/form-data,普通字段用 application/x-www-form-urlencoded,而期望 JSON 的 API 则应使用 application/json。发送错误的类型是 415 Unsupported Media Type 和 400 错误的隐蔽来源,这类错误在检查请求头之前往往显得莫名其妙。
其他值得了解的类型家族
除日常 Web 格式之外,还有几个家族值得关注。字体使用 font/woff2 和 font/ttf。图片按格式分为 image/jpeg、image/png、image/webp、image/avif、image/gif;音频与视频分别使用 audio/mpeg、audio/ogg、video/mp4 与 video/webm。归档文件和二进制数据使用 application/zip、application/gzip 和 application/octet-stream。当 API 返回无法识别的文件时,octet-stream 是最诚实的选择:它会强制客户端执行下载而非猜测类型,这正是内容未知时你希望得到的行为。
常见问题
- .json 文件应该用什么 MIME 类型?
- JSON 文件和 API 响应应使用 application/json,这是标准类型,并尽量以 UTF-8 编码返回。
- .js 文件的 MIME 类型是什么?
- JavaScript 的正式 MIME 类型是 text/javascript。旧的 application/javascript 已废弃,不应再使用。
- SVG 图片的 MIME 类型是什么?
- SVG 文件使用 image/svg+xml。必须按该类型返回,浏览器才能内联渲染 SVG。