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

Spring Boot PostMapping接收MultipartFile与JSON报415错误问题

问题根因

返回415 Content type 'multipart/form-data' not supported 是两个典型配置错误导致的:

  • 接口层错误使用@RequestBody注解接收元数据:multipart/form-data请求由多个独立的内容分片组成,@RequestBody会读取整个请求体作为单一反序列化目标,根本不支持多分片的multipart协议,自然无法识别对应媒体类型。
  • 单元测试构造请求的方式完全不符合multipart规范:直接调用.content()传入JSON字符串,是把JSON作为整个请求体发送,没有将元数据作为独立的multipart分片上传,和接口约定的请求结构不匹配。

你之前移除consumes配置后测试能通过,本质是接口退化为接收纯JSON请求,根本无法正确解析二进制文件分片,只是测试逻辑没有校验文件解析结果才会“假通过”,完全不符合实际文件上传的业务需求。


修复步骤

1. 修正接口参数注解

将元数据参数的@RequestBody注解替换为@RequestPart,显式指定分片名称,Spring会自动根据分片的Content-Type将JSON分片反序列化为FileData对象,修正后的接口代码如下:

@RequestMapping("/files")
public interface FileApi {

    @Operation(summary = "Add a new File and return its id.", tags = {"File Upload"})
    @PostMapping(path = "/upload",
            consumes = {MediaType.MULTIPART_FORM_DATA})
    ResponseEntity<String> addFile(
            @RequestPart(value = "file") final MultipartFile file,
            // 替换@RequestBody为@RequestPart,指定分片名为fileData
            @RequestPart(value = "fileData") FileData fileData,
            @Context final HttpServletRequest request
    );
}

原有consumes = MediaType.MULTIPART_FORM_DATA配置保留即可,不需要删除,Swagger/OpenAPI会自动识别该接口为multipart上传类型。

2. 修正单元测试的请求构造逻辑

不要直接用.content()传入JSON字符串,需要将JSON元数据作为一个独立的multipart分片传入,同时给该分片指定application/json的Content-Type,Spring才会将其反序列化为Java对象。修正后的测试代码如下:

@Test
public void uploadFile_success() throws Exception {
    // 构造文件分片
    final MockMultipartFile file = new MockMultipartFile("file", "test.zip", "text/plain", "test".getBytes());
    FileData fileData = new FileData();
    fileData.setFilename("bla.zip");
    fileData.setDescription("A very nice File");
    
    // 构造JSON元数据分片,指定contentType为application/json,分片名和接口@RequestPart指定的名称一致
    MockMultipartFile fileDataPart = new MockMultipartFile(
            "fileData",
            "",
            MediaType.APPLICATION_JSON_VALUE,
            MAPPER.writeValueAsBytes(fileData)
    );

    String address = "/files/upload";
    mockMvc.perform(MockMvcRequestBuilders.multipart(address)
                    .file(file)
                    // 传入元数据分片,不要用.content()直接塞JSON
                    .file(fileDataPart)
                    .contentType(MediaType.MULTIPART_FORM_DATA))
            .andExpect(status().isOk())
            .andExpect(content().string("OK"))
            .andReturn();
}

效果说明

改完上述配置后:

  • 接口可以正常接收二进制文件+JSON元数据的multipart请求,不会再报415错误
  • Swagger UI会自动渲染两个入参项:一个文件上传选择控件、一个JSON格式的元数据编辑框,完全符合文件上传的交互预期
  • 不需要额外自定义MultipartResolver或者修改Spring Boot的默认multipart配置,Spring MVC默认内置了对multipart请求中JSON分片的反序列化支持。

内容的提问来源于stack exchange,提问作者Sascha Effert

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 09:48:52