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

Spring后端同时接收大体积JSON与多文件的实现方案咨询

问题解答

1. 疑问验证

你提到的「请求只能要么传递@RequestBody标注的整体请求体,要么传递放在请求体中的表单参数」说法是正确的。
原因是HTTP协议规范中单个请求只能有一个请求体:

  • 你之前使用@RequestBody时,请求的Content-Type一般为application/json,整个请求体都是JSON内容
  • 当需要上传文件时,请求Content-Type需要改为multipart/form-data,请求体会被拆分为多个独立的part,此时框架无法再将整个请求体映射为@RequestBody对应的JSON对象,因此你原本写的两种参数同时存在的写法会报错。

2. 替代实现方案

这里给出两种生产环境常用的实现方式,都可以避免大体积JSON被放到URL参数的问题:

方案一:将JSON作为multipart的独立part传递

该方式对现有代码改动最小,JSON存放在请求体的part中,不会拼接到URL上,大小不受URL长度限制。

后端代码修改:
@PostMapping(value = "/TestEndPoint", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public void uploadData(
        // 将JSON作为单独的part接收,用@RequestPart注解,框架会自动解析为对应对象
        @RequestPart("jsonBody") MyClass jsonBody,
        // 单个文件用@RequestPart,多个文件改为List<MultipartFile>即可
        @RequestPart("file") MultipartFile file
) {
    myService.uploadData(jsonBody);
    // 补充文件处理逻辑
}
前端请求示例(以Axios为例):
const formData = new FormData();
// 把JSON对象转成Blob放到formData里,指定content-type为json
formData.append('jsonBody', new Blob([JSON.stringify(yourJsonObj)], {type: 'application/json'}));
// 追加要上传的文件
formData.append('file', yourFileObj);
// 发送请求
axios.post('/TestEndPoint', formData, {
    headers: {
        'Content-Type': 'multipart/form-data'
    }
})

方案二:自定义接收类封装所有参数

如果你的请求参数较多,也可以定义专门的DTO类来统一接收JSON和文件:

// 自定义请求DTO
public class UploadRequestDTO {
    private MyClass jsonBody;
    private MultipartFile file;
    // 多文件场景可改为 private List<MultipartFile> files;
    // 此处省略getter、setter方法
}

对应接口写法:

@PostMapping(value = "/TestEndPoint", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public void uploadData(UploadRequestDTO request) {
    myService.uploadData(request.getJsonBody());
    // 补充文件处理逻辑
}

该方式Spring会自动把对应part的内容映射到DTO的属性里,不需要额外手动解析。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 14:06:02