You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者Артём Орёл

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 17:45:05