如何使用curl向Spring REST端点提交CSV文件及file参数为空问题排查
问题根因
MultipartFile仅支持接收multipart/form-data类型的表单请求体,你的接口配置的consumes = "text/csv",且 curl 发送的是纯 CSV 二进制流,不是表单格式,类型完全不匹配。- 你给 MultipartFile 参数添加了
@RequestBody注解,Spring 的@RequestBody用于将请求体绑定到普通 POJO、字符串、字节数组等类型,无法直接绑定到MultipartFile对象,自然解析结果为 null。
修复方案
两种方案二选一即可,不需要同时修改:
方案1:保持当前curl直接传CSV流的调用方式,仅修改控制器代码
如果不需要用到 MultipartFile 封装的文件名、文件后缀校验等API,直接接收CSV内容即可,无需修改curl命令:
- 修改接口定义,替换参数类型和注解:
@PostMapping(produces = "text/csv", consumes = "text/csv") // 可根据需求选择接收为字节数组或字符串 public ResponseEntity create(@RequestBody byte[] csvContent); // 字符串写法:public ResponseEntity create(@RequestBody String csvContent);
- 实现类对应调整参数类型,拿到内容后直接按CSV逻辑处理即可。
方案2:保持用MultipartFile接收,同步修改接口配置和curl命令
如果确实需要使用MultipartFile的相关封装方法,走标准表单文件上传逻辑:
- 修改接口定义,调整consumes类型和参数注解:
import org.springframework.http.MediaType; @PostMapping(produces = "text/csv", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public ResponseEntity create(@RequestParam("file") MultipartFile file);
注意:实现类的参数注解不需要重复写,保持接口定义即可
2. 修改curl命令,使用表单参数上传文件:
curl -X POST "http://localhost:8791/api/public/v1/inboxes/csv" -H "accept: */*" -F "file=@/c/Users/Schilling/Desktop/Test.csv"
-F 参数会自动设置请求头为 multipart/form-data,不需要手动指定Content-Type,参数名 file 要和 @RequestParam 中声明的名称完全一致。
3. 异常排查:若调整后仍接收不到文件,检查项目配置中 spring.servlet.multipart.enabled 是否为 true,Spring Boot 默认开启该配置,无需额外设置。
内容的提问来源于stack exchange,提问作者L. Schilling
相关产品推荐
相关产品推荐

