Postman 上传中文文件名乱码的根源在于服务端未按 RFC 6266 正确解析 Content-Disposition 中的 filename 字段,Postman 本身已合规生成 filename(ASCII)和 filename=utf-8''%E4%B8%AD%E6%96%87.jpg 格式。

Postman 上传文件时中文名乱码,根本不是 Postman 的锅,而是服务端没按 RFC 6266 正确解析 Content-Disposition 中的 filename* 字段 —— 你得先确认后端是否真正支持 UTF-8 文件名解码。
为什么 Postman 上传的中文文件名在服务端变成问号或
Postman 本身对上传文件的中文名处理是合规的:它会把 multipart/form-data 请求中每个 part 的 Content-Disposition 头按 RFC 标准生成,包含 filename(ASCII fallback)和 filename*(UTF-8 编码值)。但很多后端框架(尤其是老版本 Spring Boot、Node.js multer、Java Servlet 容器)默认只读 filename 字段,且用平台默认编码(如 ISO-8859-1)解码,导致中文直接崩坏。
- 现象:服务端
file.getOriginalFilename()返回"???.jpg"或"%E4%B8%AD%E6%96%87.jpg"未解码 - 关键点:
filename*的格式必须是filename*=utf-8''%E4%B8%AD%E6%96%87.jpg(注意两个单引号),少一个引号或大小写错(如UTF-8)都会被忽略 - 验证方式:在 Postman 的
Console面板里点开请求 →Headers→ 找到Content-Disposition,确认是否存在filename*=字段且格式正确
Spring Boot + MultipartFile 中文文件名修复
Spring Boot 5.3+ 默认已支持 filename*,但低版本(如 2.7.x)需手动启用;即使新版,若用了 Nginx 或 Tomcat 前置代理,也可能被截断或转义。
Postman Mac版是一款专为macOS设计的API开发与测试工具,凭借简洁的界面和强大的功能,深受开发者喜爱。它支持发送各种HTTP请求(GET、POST、PUT等),轻松管理接口集合、环境变量和模拟服务器。Mac用户可享受原生性能、快捷键优化及与系统无缝集成的体验,适用于接口调试、自动化测试和文档生成。无论是个人项目还是团队协作,Postman for Mac都能提升API开发效率,是ma
- 检查
application.yml是否禁用了标准解析:spring.servlet.multipart.resolve-lazily: false(应为true或删掉) - 确保 Controller 方法参数明确使用
@RequestPart("file") MultipartFile file,而非@RequestParam—— 后者不走 multipart 解析链 - 若仍失败,在 Controller 入口加临时调试:
String disposition = request.getHeader("Content-Disposition");
log.info("Raw Content-Disposition: {}", disposition); // 看是否含 filename*
- 终极兜底:手动从 header 提取
filename*并用URLDecoder.decode(..., "UTF-8")解码,别依赖file.getOriginalFilename()
Node.js(Express + Multer)中文文件名失效
Multer 默认不处理 filename*,只认 filename 字段。哪怕 Postman 发了正确的 filename*=,Multer 也会无视。
- 必须自定义
storage.filename函数,从req.headers或req.file.fieldname关联的原始 part header 中提取 - 示例关键代码:
const storage = multer.diskStorage({
filename: (req, file, cb) => {
const disposition = req.headers['content-disposition'];
const filenameStarMatch = disposition?.match(/filename\*=(?:UTF-8'')([^;]+)/i);
const originalName = filenameStarMatch ? decodeURIComponent(filenameStarMatch[1]) : file.originalname;
cb(null, originalName);
}
});
- 注意:
decodeURIComponent要包在 try/catch 里,防止 malformed URI error - 别忘了
app.use(multer({ storage }).single('file'))中的字段名要和前端 form-data 的 key 一致
Postman 上传前必须检查的三件事
很多乱码问题其实卡在客户端配置,而不是后端。
- 在 Postman 的 Body →
form-data中,Key 类型选File(不是 Text),然后点右侧Select Files—— 直接拖入带中文名的文件,不要手动输入文件名 - 确保文件系统本身支持 UTF-8 文件名(macOS / Linux 默认支持;Windows 需确认当前代码页是 65001,或改用 WSL)
- 如果用 Pre-request Script 动态设置文件名,请勿调用
pm.request.body.formdata.append()手动拼Content-Disposition—— 这会绕过 Postman 内置的 RFC 编码逻辑,大概率出错
最常被忽略的一点:Nginx 或 API 网关(如 Kong、Tyk)可能默认 strip 或 rewrite Content-Disposition 头。如果你的请求经过了中间件,务必检查其日志或抓包确认该 header 是否完整透传到了后端。没有 filename*,后端再怎么修也是白搭。
















