@RequestBody和 MultipartFile 可以同时使用吗?

不可以!

因为这两者预期的请求内容类型不同。@RequestBody 预期请求的 Content-Type application/json application/xml,而 MultipartFile 预期的是 multipart/form-data


如果你想在同一个请求中发送 JSON 数据和文件,以下有3种实现方式:

  • 第一种:通过一个对象来接收文件上传和其他参数

你需要确保客户端发送的请求是multipart/form-data类型。

@Data
@ApiModel("保存文件请求")
public class SaveFileRequest {

    @ApiModelProperty(value = "文件名称", required = true)
    private String name;

    @ApiModelProperty("订单id")
    private Long taskId;

    @ApiModelProperty(value = "文件", required = true)
    private MultipartFile[] multipartFile;
}
@PostMapping("/upload")
public ResponseEntity<String> handleFileUpload(@ModelAttribute SaveFileRequest metadata) {
    // 这里你可以通过metadata对象访问所有的参数和文件
    MultipartFile file = metadata.getMultipartFile();
    // 处理文件上传和其他参数
    return ResponseEntity.ok("文件上传成功!");
}

在方法的参数上使用@ModelAttribute注解可以绑定请求参数到一个模型对象。这通常用于将表单数据封装到一个Bean中。 

 注意:即使你没有显式地使用@ModelAttribute注解,Spring 也能够自动将请求参数绑定到你的对象上,显式使用@ModelAttribute可以使你的代码更清晰。


  • 第二种: 使用 multipart/form-data

当你上传文件时,通常会使用 multipart/form-data 编码类型。在这种情况下,你可以使用 @RequestParam 来获取表单字段和 MultipartFile 来获取文件,如下所示:

@PostMapping("/upload")
public String handleFileUpload(
        @RequestParam("file") MultipartFile file,
        @RequestParam("name") String name,
        @RequestParam("age") int age) {
    // 处理上传的文件和参数
    return "文件上传成功!";
}

在这个例子中,客户端需要在表单中包含一个文件输入和两个文本输入(分别对应 nameage 字段)。


  • 第三种: 使用 application/json 

如果你想同时接收 JSON 数据和上传文件,你可以使用 @RequestPart 注解:

@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public String handleFileUpload(
        @RequestPart("file") MultipartFile file,
        @RequestPart("metadata") MyObject metadata) {
    // 处理上传的文件和JSON数据
    return "文件上传成功!";
}

在这个例子中,MyObject 是一个用来接收 JSON 数据的 Java 类。

注意,在这种情况下,你不能直接使用 @RequestBody 来接收 JSON 数据,因为整个请求的内容类型是 multipart/form-data 而不是 application/json

感谢大家的观看,喜欢请点个赞吧!

  • 13
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值