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

Spring中如何解决415 UNSUPPORTED_MEDIA_TYPE错误?

解决Spring Web接口接收Excel文件报415 UNSUPPORTED_MEDIA_TYPE的问题

核心问题分析

从日志能定位两个关键问题:

  1. 请求路径/api/personal-info/upload与控制器映射路径/personal-info/upload不匹配
  2. 请求参数为空(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 23:45:17