后端收到的是含字段名但无文件内容的空 multipart 字段;Spring Boot 中 MultipartFile 默认为 null,required=true 则 400;手动解析可能得长度为 0 的 Part;Postman 模拟需保留 key、清空 value,不可填字符串或换请求类型。

不选文件却点 Send,后端到底收到什么?
Postman 的 form-data 提交不会因为没选文件就报错或拦截——它会发一个空字段过去,字段名存在,但值为空(Content-Disposition: form-data; name="file" 后面没有 filename,也没有二进制内容)。后端是否校验、如何处理这个“空 file 字段”,完全取决于你写的接口逻辑。很多框架(如 Spring Boot 的 @RequestParam MultipartFile file)默认会把未选文件当作 null,但若配置了 required = true 就直接 400;而有些老接口用 HttpServletRequest 手动解析,则可能拿到一个长度为 0 的 Part。
怎么模拟“用户没选文件却点了提交”这个场景?
关键不是“删掉字段”,而是保留字段名、清空文件选择、确保没意外带其他值:
- 在
Body → form-data中,保持 key 名(比如file)存在,value 栏显示 “No file chosen” 或空白即可 - 不要手动在 value 里填字符串(如
""或null),那会变成文本字段,Content-Type 不再是multipart/form-data的文件部分 - 不要切换到
x-www-form-urlencoded或raw去伪造,那样发的压根不是 multipart 请求,无法测试真实边界 - 如果接口允许多个文件(如
files字段),可只选其中一部分,留一个空着,验证后端是否对每个项单独校验
常见误判:为什么 status 200 却提示“文件不能为空”?
这说明后端做了业务层校验,而非请求格式失败。注意区分以下几种响应:
-
400 Bad Request:通常是框架级拦截(如 Spring 的MultipartFilerequired 未满足) -
200 OK+ JSON 里{"code":400,"msg":"文件不能为空"}:后端代码显式判断了file.isEmpty()或file == null -
500 Internal Server Error:后端没做空值防护,调用file.getOriginalFilename()时 NPE
真正要测的,就是第二种——它最贴近真实用户操作失误的路径。
Postman 12.27.7 Windows x64 官方安装包,适用于 API 设计、调试、测试与协作。该系列包含 Enterprise 云端性能测试静态 IP 出口能力,以及接口规范标签管理改进,适合受限网络测试与规范资源组织场景。
配合断言快速验证必填逻辑是否生效
在 Postman 的 Tests 标签页里加一段轻量检查,比肉眼扫响应更快:
if (pm.response.code === 200) {
const json = pm.response.json();
// 假设错误返回固定结构
pm.test("文件未选时应返回明确错误", function () {
pm.expect(json.code).to.eql(400);
pm.expect(json.msg).to.include("文件");
});
}
注意:别写成 pm.expect(json.file).to.be.null——后端根本不会把 file 字段塞进响应体,这是典型想当然的断言误区。
实际测试中,最容易被忽略的是「空文件字段和完全不传字段」在服务端表现可能完全不同。前者有 key、无 content;后者连 key 都不存在。务必确认你的接口文档或代码里校验的是哪一种。










