调用文件上传POST接口时出现HTTP 400错误求助
文件上传接口400 Bad Request排查方案
问题背景
Java控制器定义的文件上传端点代码:
@RequestMapping(value = "/upload/file", method = { RequestMethod.POST}) public MyResponse<?> uploadFile(@RequestHeader(required = true) String country, @RequestHeader(required = true) String user, @RequestParam("file") MultipartFile file) { }
React端调用代码:
const response = await MyReactUtility.postMultipartFileContent(endpoint, result); postMultipartFileContent(url, data) { let formData = new FormData(); formData.append("file", data.files[0]); return axios.post(url, formData).catch(err => console.log("Axios multipart err: ", err)); },
Chrome Network面板显示Payload仅包含file: (binary),调用接口时返回400 Bad Request。
排查及解决方向
1. 缺少必填请求头
Java接口明确要求country和user两个必填请求头,但当前React请求未携带这两个字段,后端校验不通过直接返回400。
解决:修改React请求方法,添加请求头参数:
postMultipartFileContent(url, data, headers) { let formData = new FormData(); formData.append("file", data.files[0]); // 携带必填请求头 return axios.post(url, formData, { headers }).catch(err => console.log("Axios multipart err: ", err)); },
调用时传入包含country和user的headers对象:
const response = await MyReactUtility.postMultipartFileContent(endpoint, result, { country: "你的国家值", user: "当前用户标识" });
2. 文件字段为空或字段名不匹配
检查data.files[0]是否有效:如果data.files是空数组,会导致FormData中file字段无内容,触发后端参数校验失败;另外要确保字段名和Java接口@RequestParam("file")完全一致。
解决:添加文件存在性校验:
postMultipartFileContent(url, data, headers) { let formData = new FormData(); if (!data.files || data.files.length === 0) { throw new Error("请选择要上传的文件"); } formData.append("file", data.files[0]); return axios.post(url, formData, { headers }).catch(err => console.log("Axios multipart err: ", err)); },
3. Axios请求头被篡改(可选排查)
虽然FormData会自动设置Content-Type为multipart/form-data,但如果项目中有请求拦截器篡改了请求头,可能导致后端无法解析Multipart请求。
解决:手动指定请求头(注意不要手动设置边界,让浏览器自动处理):
return axios.post(url, formData, { headers: { ...headers, 'Content-Type': 'multipart/form-data' } }).catch(err => console.log("Axios multipart err: ", err));
4. 后端Multipart配置缺失
如果后端未正确配置Multipart文件解析器,会导致无法处理文件上传请求,返回400。
解决:
- 若为Spring Boot项目,确保已引入
spring-boot-starter-web依赖(自动配置Multipart支持); - 若为传统Spring项目,需手动配置MultipartResolver Bean:
@Bean public CommonsMultipartResolver multipartResolver() { CommonsMultipartResolver resolver = new CommonsMultipartResolver(); resolver.setMaxUploadSize(10485760); // 限制最大上传大小为10MB return resolver; }
内容的提问来源于stack exchange,提问作者copenndthagen
相关产品推荐
相关产品推荐

