MIME 类型一览
标识文件种类的 MIME 类型(媒体类型)一览表,可用于 Web 服务器配置、Content-Type 头设置以及文件上传校验等开发工作。
什么是 MIME 类型
MIME(Multipurpose Internet Mail Extensions)类型是标识文件格式与性质的标准机制,写作 类型/子类型,用于告知浏览器和服务器如何处理内容。可在 HTTP 响应的 Content-Type 头以及 HTML 的 <input type="file" accept="..."> 属性中指定。
图像(image)
| 扩展名 | MIME 类型 | 说明 |
|---|---|---|
| .jpg / .jpeg | image/jpeg | JPEG 图像。有损压缩,适合照片 |
| .png | image/png | PNG 图像。支持透明的无损压缩格式 |
| .gif | image/gif | GIF 图像。支持动画,最多 256 色 |
| .webp | image/webp | WebP 图像。Google 开发的高压缩格式 |
| .avif | image/avif | AVIF 图像。基于 AV1 的新一代格式 |
| .svg | image/svg+xml | SVG 矢量图。基于 XML |
| .ico | image/x-icon | 图标文件,用于 favicon 等 |
| .bmp | image/bmp | 位图图像。无压缩 |
| .tiff / .tif | image/tiff | TIFF 图像,用于印刷与 DTP |
文档(application)
| 扩展名 | MIME 类型 | 说明 |
|---|---|---|
application/pdf | PDF 文档 | |
| .doc | application/msword | Microsoft Word(旧格式) |
| .docx | application/vnd.openxmlformats-officedocument.wordprocessingml.document | Microsoft Word(OOXML 格式) |
| .xls | application/vnd.ms-excel | Microsoft Excel(旧格式) |
| .xlsx | application/vnd.openxmlformats-officedocument.spreadsheetml.sheet | Microsoft Excel(OOXML 格式) |
| .ppt | application/vnd.ms-powerpoint | Microsoft PowerPoint(旧格式) |
| .pptx | application/vnd.openxmlformats-officedocument.presentationml.presentation | Microsoft PowerPoint(OOXML 格式) |
文本(text)
| 扩展名 | MIME 类型 | 说明 |
|---|---|---|
| .txt | text/plain | 纯文本 |
| .html / .htm | text/html | HTML 文档 |
| .css | text/css | CSS 样式表 |
| .csv | text/csv | 逗号分隔文本 |
| .xml | text/xml | XML 文档 |
| .js | text/javascript | JavaScript(application/javascript 亦有效) |
| .json | application/json | JSON 数据 |
| .md | text/markdown | Markdown 文本 |
音频(audio)
| 扩展名 | MIME 类型 | 说明 |
|---|---|---|
| .mp3 | audio/mpeg | MP3 音频。最普及的音频格式 |
| .wav | audio/wav | WAV 音频。未压缩 PCM |
| .ogg | audio/ogg | Ogg Vorbis 音频 |
| .flac | audio/flac | FLAC 音频。无损压缩 |
| .aac | audio/aac | AAC 音频。MP3 的后继格式 |
| .webm | audio/webm | WebM 音频 |
| .m4a | audio/mp4 | MPEG-4 音频 |
视频(video)
| 扩展名 | MIME 类型 | 说明 |
|---|---|---|
| .mp4 | video/mp4 | MP4 视频。最普及的视频格式 |
| .webm | video/webm | WebM 视频。面向 Web 的开放格式 |
| .avi | video/x-msvideo | AVI 视频 |
| .mov | video/quicktime | QuickTime 视频 |
| .mkv | video/x-matroska | Matroska 视频容器 |
| .mpeg | video/mpeg | MPEG 视频 |
归档与压缩(application)
| 扩展名 | MIME 类型 | 说明 |
|---|---|---|
| .zip | application/zip | ZIP 压缩包 |
| .gz / .gzip | application/gzip | Gzip 压缩文件 |
| .tar | application/x-tar | tar 归档 |
| .tar.gz | application/gzip | tar+gzip 压缩包 |
| .rar | application/vnd.rar | RAR 压缩包 |
| .7z | application/x-7z-compressed | 7-Zip 压缩包 |
| .bz2 | application/x-bzip2 | Bzip2 压缩文件 |
字体(font)
| 扩展名 | MIME 类型 | 说明 |
|---|---|---|
| .woff | font/woff | Web Open Font Format |
| .woff2 | font/woff2 | WOFF2。压缩率更高 |
| .ttf | font/ttf | TrueType 字体 |
| .otf | font/otf | OpenType 字体 |
其他
| 扩展名 | MIME 类型 | 说明 |
|---|---|---|
| (未知) | application/octet-stream | 通用二进制数据。未知格式的默认值 |
| .wasm | application/wasm | WebAssembly 二进制 |
开发中如何使用 MIME 类型
服务器端配置
Apache 或 Nginx 等 Web 服务器需配置文件扩展名与 MIME 类型的对应关系。若配置有误,浏览器就无法正确处理文件——例如 .webp 若未设置正确类型,就会被当作下载而非显示为图像。
文件上传校验
实现文件上传功能时,除扩展名外还应校验 MIME 类型。但 MIME 类型可在客户端伪造,出于安全考虑建议同时校验文件开头的魔术字节。
Content-Type 头
API 响应与文件下载时请设置准确的 Content-Type:JSON 用 application/json,CSV 用 text/csv。需要显式声明编码时,可像 text/html; charset=utf-8 这样追加 charset 参数。
在服务器配置中声明 MIME 类型
以下是发布 WebP / AVIF / WASM / 字体等现代格式时常用的配置片段,这些格式往往不在服务器的默认映射中。
Apache .htaccess
# 现代图片格式
AddType image/webp .webp
AddType image/avif .avif
AddType image/svg+xml .svg .svgz
# 字体(积极缓存)
AddType font/woff .woff
AddType font/woff2 .woff2
# WebAssembly 与现代 JSON 变体
AddType application/wasm .wasm
AddType application/manifest+json .webmanifest
AddType application/ld+json .jsonld
# 以 UTF-8 提供文本类资源
AddCharset utf-8 .html .css .js .json .xml
Nginx(覆盖 mime.types)
types {
image/webp webp;
image/avif avif;
application/wasm wasm;
application/manifest+json webmanifest;
}
# 为 text/* 与 application/json 强制指定字符集
charset utf-8;
charset_types text/css text/plain text/xml application/javascript application/json application/xml;
PHP — 发送 Content-Type
// 以指定文件名下载 PDF
header('Content-Type: application/pdf');
header('Content-Disposition: attachment; filename="invoice.pdf"');
readfile($path);
// JSON API 响应(务必显式声明 charset)
header('Content-Type: application/json; charset=utf-8');
echo json_encode($data, JSON_UNESCAPED_UNICODE);
Node.js / Express
// Express 会根据 res.type() 或扩展名推断 Content-Type
app.get('/data.json', (req, res) => {
res.type('application/json').send({ ok: true });
});
// 以显式 MIME 类型进行文件流式传输
app.get('/report.csv', (req, res) => {
res.set('Content-Type', 'text/csv; charset=utf-8');
fs.createReadStream('report.csv').pipe(res);
});
Python — Flask / FastAPI
# Flask
from flask import Response
return Response(csv_text, mimetype='text/csv', headers={'Content-Disposition': 'attachment; filename="data.csv"'})
# FastAPI
from fastapi.responses import Response
return Response(content=json_str, media_type='application/json')
Go — net/http
w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.Header().Set("X-Content-Type-Options", "nosniff") // 安全性:参见下文
json.NewEncoder(w).Encode(data)
安全:为什么需要 X-Content-Type-Options: nosniff
历史上,当 Content-Type 头缺失或错误时,浏览器会「嗅探」文件内容来猜测类型。这是已知的攻击途径:若以 image/jpeg 上传的文件实际是含 <script> 的 HTML,浏览器可能将其嗅探为 HTML 并执行脚本,造成 XSS。
请在所有响应中发送 X-Content-Type-Options: nosniff。该头告诉浏览器信任服务器声明的 Content-Type、不要自行猜测。对用户上传文件和 JSON API 尤为必要(存在诱导浏览器把 JSON 当作 HTML 或 JS 解析的攻击)。
上传校验 — 三层规则
- 扩展名检查 — 速度快,但只要重命名文件即可绕过。仅作为 UX 提示使用。
- 客户端发送的 MIME 类型(multipart 边界内的
Content-Type)— 同样容易伪造,浏览器只是根据扩展名推断而已。 - 魔术字节(文件签名)检测 — 读取文件开头的实际字节,与已知签名比对(JPEG 为
FF D8 FF,PNG 为89 50 4E 47)。只有这一层是可信的。详见魔术字节参考。
生产环境铁律:三层全做。前两层作为快速过滤挡掉明显垃圾,第三层作为权威的最终校验。
常见问题
application/json 与 text/json 有什么区别?
application/json 是 RFC 8259 定义并在 IANA 注册的正式类型。text/json 只是早期部分服务器使用的非官方写法,从未注册,应避免使用。由于 JSON 规范强制 UTF-8,charset 参数在技术上是冗余的——写上无害,但没有必要。
.webp 或 .avif 在浏览器中不显示而是被下载
原因是服务器没有该扩展名的映射,回退到了 application/octet-stream,浏览器便判断为未知二进制而提示下载。请在 Apache / Nginx 配置中添加 image/webp / image/avif 映射(参见上文片段)。
上传校验时可以信任浏览器发送的 MIME 类型吗?
不能。浏览器仅根据选择文件时的扩展名来决定 MIME,因此把 malware.exe 改名为 cute-cat.jpg,浏览器就会老实地报告 image/jpeg。请务必组合扩展名、客户端 MIME 与魔术字节检测三层校验。
服务器无法识别的文件该用哪种 MIME?
使用 application/octet-stream。它被明确定义为任意二进制数据,是安全的默认值:浏览器不会尝试渲染而是提示下载,从而避免误执行。
application/x-www-form-urlencoded 中的 x- 前缀是什么?
历史上 x- 用于表示「实验性 / 非标准」。RFC 6648(2012)已废除该惯例,但 application/x-www-form-urlencoded、image/x-icon、application/x-tar 等广泛使用的类型为向后兼容仍保留了前缀。
图像、PDF 等二进制类型也要加 charset 吗?
不需要。charset 只对文本类型(text/*、application/json、application/xml)有意义。加在 image/jpeg 或 application/pdf 上没有作用,部分中间层(CDN、代理)还会将其删除。