跳到内容

MIME 类型一览

标识文件种类的 MIME 类型(媒体类型)一览表,可用于 Web 服务器配置、Content-Type 头设置以及文件上传校验等开发工作。

什么是 MIME 类型

MIME(Multipurpose Internet Mail Extensions)类型是标识文件格式与性质的标准机制,写作 类型/子类型,用于告知浏览器和服务器如何处理内容。可在 HTTP 响应的 Content-Type 头以及 HTML 的 <input type="file" accept="..."> 属性中指定。

type/subtype text/* image/* audio/* video/* application/* text/plain text/html text/css text/csv image/jpeg image/png image/webp image/svg+xml audio/mpeg audio/wav audio/ogg video/mp4 video/webm video/quicktime application/pdf application/json application/zip application/octet-stream
图:MIME 类型层级结构(顶级类型 → 子类型)

图像(image)

扩展名 MIME 类型 说明
.jpg / .jpegimage/jpegJPEG 图像。有损压缩,适合照片
.pngimage/pngPNG 图像。支持透明的无损压缩格式
.gifimage/gifGIF 图像。支持动画,最多 256 色
.webpimage/webpWebP 图像。Google 开发的高压缩格式
.avifimage/avifAVIF 图像。基于 AV1 的新一代格式
.svgimage/svg+xmlSVG 矢量图。基于 XML
.icoimage/x-icon图标文件,用于 favicon 等
.bmpimage/bmp位图图像。无压缩
.tiff / .tifimage/tiffTIFF 图像,用于印刷与 DTP

文档(application)

扩展名 MIME 类型 说明
.pdfapplication/pdfPDF 文档
.docapplication/mswordMicrosoft Word(旧格式)
.docxapplication/vnd.openxmlformats-officedocument.wordprocessingml.documentMicrosoft Word(OOXML 格式)
.xlsapplication/vnd.ms-excelMicrosoft Excel(旧格式)
.xlsxapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheetMicrosoft Excel(OOXML 格式)
.pptapplication/vnd.ms-powerpointMicrosoft PowerPoint(旧格式)
.pptxapplication/vnd.openxmlformats-officedocument.presentationml.presentationMicrosoft PowerPoint(OOXML 格式)

文本(text)

扩展名 MIME 类型 说明
.txttext/plain纯文本
.html / .htmtext/htmlHTML 文档
.csstext/cssCSS 样式表
.csvtext/csv逗号分隔文本
.xmltext/xmlXML 文档
.jstext/javascriptJavaScript(application/javascript 亦有效)
.jsonapplication/jsonJSON 数据
.mdtext/markdownMarkdown 文本

音频(audio)

扩展名 MIME 类型 说明
.mp3audio/mpegMP3 音频。最普及的音频格式
.wavaudio/wavWAV 音频。未压缩 PCM
.oggaudio/oggOgg Vorbis 音频
.flacaudio/flacFLAC 音频。无损压缩
.aacaudio/aacAAC 音频。MP3 的后继格式
.webmaudio/webmWebM 音频
.m4aaudio/mp4MPEG-4 音频

视频(video)

扩展名 MIME 类型 说明
.mp4video/mp4MP4 视频。最普及的视频格式
.webmvideo/webmWebM 视频。面向 Web 的开放格式
.avivideo/x-msvideoAVI 视频
.movvideo/quicktimeQuickTime 视频
.mkvvideo/x-matroskaMatroska 视频容器
.mpegvideo/mpegMPEG 视频

归档与压缩(application)

扩展名 MIME 类型 说明
.zipapplication/zipZIP 压缩包
.gz / .gzipapplication/gzipGzip 压缩文件
.tarapplication/x-tartar 归档
.tar.gzapplication/gziptar+gzip 压缩包
.rarapplication/vnd.rarRAR 压缩包
.7zapplication/x-7z-compressed7-Zip 压缩包
.bz2application/x-bzip2Bzip2 压缩文件

字体(font)

扩展名 MIME 类型 说明
.wofffont/woffWeb Open Font Format
.woff2font/woff2WOFF2。压缩率更高
.ttffont/ttfTrueType 字体
.otffont/otfOpenType 字体

其他

扩展名 MIME 类型 说明
(未知)application/octet-stream通用二进制数据。未知格式的默认值
.wasmapplication/wasmWebAssembly 二进制

开发中如何使用 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 解析的攻击)。

上传校验 — 三层规则

  1. 扩展名检查 — 速度快,但只要重命名文件即可绕过。仅作为 UX 提示使用。
  2. 客户端发送的 MIME 类型(multipart 边界内的 Content-Type)— 同样容易伪造,浏览器只是根据扩展名推断而已。
  3. 魔术字节(文件签名)检测 — 读取文件开头的实际字节,与已知签名比对(JPEG 为 FF D8 FF,PNG 为 89 50 4E 47)。只有这一层是可信的。详见魔术字节参考

生产环境铁律:三层全做。前两层作为快速过滤挡掉明显垃圾,第三层作为权威的最终校验。

常见问题

application/jsontext/json 有什么区别?

application/jsonRFC 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-urlencodedimage/x-iconapplication/x-tar 等广泛使用的类型为向后兼容仍保留了前缀。

图像、PDF 等二进制类型也要加 charset 吗?

不需要。charset 只对文本类型(text/*application/jsonapplication/xml)有意义。加在 image/jpegapplication/pdf 上没有作用,部分中间层(CDN、代理)还会将其删除。