深色模式
MIME 类型
概述
文件后缀只能告诉人“这看起来像什么”,MIME 类型则更适合告诉程序“应该按什么方式处理”。在 HTTP、邮件、上传下载、对象存储这些场景里,真正影响解析方式的,常常不是文件名,而是 Content-Type。
理解 MIME 类型,重点不在死记硬背表格,而在于先知道它在做什么:给一段内容贴上明确的媒体类型标签。
MIME 类型是什么
MIME 类型通常长这样:
text
type/subtype例如:
text/plaintext/htmlapplication/jsonimage/png
它由主类型和子类型组成:
- 主类型决定大类,例如文本、图片、音频、视频、应用数据
- 子类型决定更具体的格式
为什么 MIME 类型重要
同样一份字节数据,不同程序可能有不同理解方式。
例如一个接口返回:
text/html,浏览器可能按页面去渲染application/json,前端代码通常会按结构化数据处理application/octet-stream,浏览器往往会把它当成通用二进制下载
这也是为什么同一个文件,扩展名看似没问题,但 Content-Type 配错后,浏览器行为还是会很奇怪。
和文件后缀是什么关系
两者相关,但不是一回事。
- 文件后缀是命名习惯,例如
.png、.json MIME类型是内容类型标识,例如image/png、application/json
大多数时候,程序会根据后缀猜一个 MIME 类型,但这只是推断,不是文件本体自带的绝对真相。
常见主类型
text
用于纯文本或文本类内容,例如:
text/plaintext/htmltext/csstext/csv
image
用于图片,例如:
image/pngimage/jpegimage/gifimage/webpimage/svg+xml
audio
用于音频,例如:
audio/mpegaudio/oggaudio/wav
video
用于视频,例如:
video/mp4video/webmvideo/mpeg
application
这是最常见、也最容易装很多东西的大类。它通常表示结构化数据、二进制数据或某类应用格式,例如:
application/jsonapplication/xmlapplication/pdfapplication/zipapplication/javascriptapplication/octet-stream
其中 application/octet-stream 往往表示“通用二进制流”,也就是服务器不打算更细地告诉你它是什么。
开发里最常见的一组 Content-Type
| 场景 | 常见类型 |
|---|---|
| 普通文本 | text/plain; charset=utf-8 |
| 网页 | text/html; charset=utf-8 |
| 样式表 | text/css |
| JSON 接口 | application/json |
| 表单提交 | application/x-www-form-urlencoded |
| 文件上传 | multipart/form-data |
| PNG 图片 | image/png |
| JPEG 图片 | image/jpeg |
| PDF 文件 | application/pdf |
| 二进制下载 | application/octet-stream |
charset 在哪里起作用
像 text/html; charset=utf-8 里的 charset,表示文本内容使用什么字符编码。
它对文本类内容尤其重要。如果服务端返回中文文本,却没写对字符集,客户端可能按错误编码去解释,结果就是乱码。
上传和下载时的两个常见头
Content-Type
说明主体内容是什么格式。
Content-Disposition
说明浏览器更适合把内容直接展示,还是当成附件下载。
例如文件下载常会配合:
text
Content-Type: application/pdf
Content-Disposition: attachment; filename="report.pdf"前者说明“这是 PDF”,后者说明“别直接嵌进页面,倾向于下载”。
常见误区
把文件后缀当成最终依据
后缀能帮忙猜,但真正影响客户端处理方式的,经常是 Content-Type。
任何二进制都写成 application/octet-stream
这不算错,但会损失很多信息。能标明确类型时,通常更好。
JSON 返回成 text/plain
有些接口这样也能凑合跑,但中间件、缓存层、浏览器和调试工具会更难正确理解它。
忽略字符集
文本类内容没有明确字符集时,乱码就容易开始上班。
