React+Spring上传图片遇MultipartException:当前请求非多部分请求
问题分析与解决方法
首先明确:这个报错和Assets、Image的实体关联配置无关,核心是前端Axios发送的请求没有正确构造为multipart/form-data格式,导致Spring无法识别。
下面是具体排查方向和解决办法:
1. 修正Axios请求的Content-Type设置
不要手动指定Content-Type为multipart/form-data——浏览器会自动生成包含boundary分隔符的正确请求头,手动设置会丢失boundary信息,直接导致Spring无法解析请求。
- 错误写法:
axios.post('/api/assets', formData, { headers: { 'Content-Type': 'multipart/form-data' // 手动设置会破坏请求结构 } })
- 正确写法:
// 直接传入FormData,Axios会自动处理Content-Type axios.post('/api/assets', formData)
2. 确保FormData构造正确
要把Assets的文本字段、图片文件都正确添加到FormData实例中,键名要和后端控制器的参数名对应:
const formData = new FormData(); // 添加Assets的普通属性 formData.append('assetName', document.getElementById('name').value); formData.append('assetDesc', document.getElementById('desc').value); // 添加图片文件(多文件可循环append) formData.append('assetImages', fileInput.files[0]);
3. 检查Spring控制器的参数接收逻辑
控制器方法要正确匹配前端FormData的键名,同时明确标注接收Multipart类型的请求:
@PostMapping("/assets") @CrossOrigin public ResponseEntity<Assets> createAsset( @RequestParam("assetName") String name, @RequestParam("assetDesc") String description, @RequestParam("assetImages") MultipartFile image) { // 业务逻辑:创建Assets实例,关联Image实体,保存文件到服务器等 return ResponseEntity.ok(savedAsset); }
如果需要直接绑定Assets实体+文件,可结合@ModelAttribute:
public ResponseEntity<Assets> createAsset( @ModelAttribute Assets asset, @RequestParam("assetImages") MultipartFile image) { // 处理关联与保存逻辑 }
4. 确认Spring的Multipart支持配置
Spring Boot默认会自动启用multipart支持,若需自定义上传限制,可在application.properties中配置:
spring.servlet.multipart.max-file-size=10MB spring.servlet.multipart.max-request-size=10MB
非Spring Boot项目则需手动配置MultipartResolver:
@Configuration public class MultipartConfig { @Bean public MultipartResolver multipartResolver() { CommonsMultipartResolver resolver = new CommonsMultipartResolver(); resolver.setMaxUploadSize(10485760); // 10MB return resolver; } }
5. 排查中间件对请求的修改
检查前端请求拦截器、后端过滤器是否存在修改请求头/请求体的逻辑,比如某些拦截器可能会强制覆盖Content-Type,导致boundary丢失。
内容的提问来源于stack exchange,提问作者Артём Орёл
相关产品推荐
相关产品推荐

