Spring中如何解决415 UNSUPPORTED_MEDIA_TYPE错误?
解决Spring Web接口接收Excel文件报415 UNSUPPORTED_MEDIA_TYPE的问题
核心问题分析
从日志能定位两个关键问题:
- 请求路径
/api/personal-info/upload与控制器映射路径/personal-info/upload不匹配 - 请求参数为空(
parameters={}),说明前端未正确传递FormData请求体
解决方案
1. 修复前端请求,传递FormData请求体
你的React代码创建了FormData但未作为请求体发送,这是Spring无法解析请求的核心原因。修改代码如下:
export const uploadPersonalInfo = async (file) => { const formData = new FormData(); formData.append('file', file); await fetch(`${API_BASE_URL}/personal-info/upload`, { method: 'POST', headers: { 'Authorization': `Bearer ${authenticationService.getToken()}` // 不要手动设置Content-Type,浏览器会自动添加带boundary的multipart/form-data头 }, body: formData // 新增这一行,传递表单数据 }); };
2. 修正请求路径匹配问题
日志显示实际请求路径为/api/personal-info/upload,但你的控制器@RequestMapping为/personal-info,导致路径不匹配。请二选一来修复:
方案A:修改控制器路径,添加/api前缀
@RestController @RequestMapping("/api/personal-info") // 添加/api前缀,与请求路径匹配 @RequiredArgsConstructor @PreAuthorize("hasRole('ADMIN')") public class PersonalInfoController { private final PersonalInfoService personalInfoService; @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public ResponseEntity<String> uploadPersonalInfo(@RequestParam("file") MultipartFile file) { this.personalInfoService.seedPersonalInfo(file); return new ResponseEntity<>("File uploaded and database seeded successfully", HttpStatus.OK); } }
方案B:调整前端API_BASE_URL,移除/api前缀
确保API_BASE_URL的值不包含/api,使请求路径变为/personal-info/upload,与控制器映射路径一致。
3. 验证其他配置(已确认可跳过)
你已正确配置multipart参数和CORS规则,这两部分无需修改:
- Multipart配置确保了文件上传的大小限制
- CORS配置允许了localhost:3000的跨域请求
验证修复效果
修复后重新发送请求,日志中应显示parameters={file=[...]}, 且不再出现HttpMediaTypeNotSupportedException,接口将正常返回200状态码。
内容的提问来源于stack exchange,提问作者Vasil Velinov
相关产品推荐
相关产品推荐

