如何使用Spring在1个请求中获取MultiPart文件和表单数据?

时间:2016-09-08 15:56:44

标签: java spring jackson postman

我有以下控制器:

@RequestMapping(value="/upload", method=RequestMethod.PUT)
public ResponseEntity<String> handleFileUpload(
            @RequestParam("file") MultipartFile file,
            @RequestBody Campaign inputCampaign,
            Principal principal) {

每当我没有@RequestBody Campaign inputCampaign这是一个保存用户视频数据的对象时,它就能正常工作,并将上传视频并保存到正确的目录。

但是,我想在1个请求中获取他们上传的文件和与其广告系列相关联的表单数据,以便我可以保存有关其广告系列的相关信息(例如标题,说明等)。

当我尝试使用上面的控制器,并尝试在Postman中发送请求时,我收到以下错误:

  "timestamp": 1473349676109,
  "status": 415,
  "error": "Unsupported Media Type",
  "exception": "org.springframework.web.HttpMediaTypeNotSupportedException",
  "message": "Content type 'multipart/form-data;boundary=----WebKitFormBoundaryTVc9eDC2a2elulOx;charset=UTF-8' not supported",
  "path": "/dashboard/upload"

这是我的邮递员请求设置:

Postman Request

如何在一个请求中发送广告系列表单数据和文件?广告系列对象有很多字段,因此我不想将@RequestParam放在每个表单字段的控制器参数中。杰克逊应该自动映射属性。

1 个答案:

答案 0 :(得分:1)

杰克。

您是否尝试删除这两个注释?

出于演示目的,我做了一个简单的映射,如下所示:

@PutMapping("/file/{fileName}")
@ResponseBody
public String[] postFile(
        @PathVariable(name = "fileName") String fileName,
        List<MultipartFile> files,
        User user
) throws IOException {
    return new String[]{
            fileName,
            user.getUsername(),
            files.stream()
                    .map((f)-> f.getOriginalFilename())
                    .reduce("", (e, f)->e.concat(f).concat(", "))
    };
}

我尝试将少量文件上传到List<MultipartFile> files

Sample output from Postman

如图所示,filesuser数据都是自动映射的,不需要任何注释。

希望它有所帮助。