java 接受MultipartFile和JSON Object的Spring控制器

4xrmg8kj  于 2023-05-12  发布在  Java
关注(0)|答案(2)|浏览(192)

我需要在Java Springboot中创建一个POST端点,它接受MultipartFile(一个原始文件,如xlsx,我们可以从windows资源管理器上传的doc)和JSON Object(元数据)。JSON对象将作为字符串提供,如:

{
  "address": "string",
  "fullName": "string"
}

我尝试了以下方法:
控制器:

@PostMapping(path = "/post", consumes = {"application/json","multipart/form-data"})
  public ResponseEntity<String> endpoint(
    @RequestBody ReportDto reportDto,
    @RequestPart("myFile") MultipartFile myFile
  ){
  return ResponseEntity.ok(service.process(reportDto,myFile));
  }

要在控制器中使用的ReportDto:

public class ReportDto{
  
  String address;
  String fullName;
    //getters
    //setters
    //all arg constructor
    //no arg constructor
  
  }

当我尝试通过Swagger或POSTMAN访问端点时,我得到HTTP 415:不支持的媒体错误。
我的URL请求看起来像这样:

curl -X 'POST' \
  'http://localhost:8080/api/v1/dashboards/post' \
  -H 'accept: */*' \
  -H 'Authorization: Bearer somebearertoken' \
  -H 'Content-Type: multipart/form-data' \
  -F 'reportDto={
  "address": "string",
  "fullName": "string"
}' \
  -F 'myFile=@Table_New.xlsx;type=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'

请帮我解决这个问题

bxjv4tth

bxjv4tth1#

像这样修改控制器方法:

@PostMapping(path = "/post", consumes = {MediaType.MULTIPART_FORM_DATA_VALUE})
public ResponseEntity<String> endpoint(
        @RequestPart ReportDto reportDto,
        @RequestPart MultipartFile myFile) {
    return ResponseEntity.ok(service.process(reportDto, myFile));
}

请注意:如果注解RequestPart中的name属性与参数名称匹配,则不需要该属性。还请注意,使用MediaType中定义的常量有助于避免打字错误/错误。
您还应该将reportDto的媒体类型定义添加到CURL/Postman请求中:

-F 'reportDto={
    "address": "string",
    "fullName": "string"};
    type=application/json'
oymdgrw7

oymdgrw72#

[错误答案]HTTP请求必须有确切的body数据类型,如json,xml,html。所以你不能在http body中放入两种数据。您可以通过url传输参数,通过body传输文件数据。

相关问题