有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我有以下控制器:

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

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

但是,我想将他们上传的文件和与他们的活动相关联的表单数据放在一个请求中,这样我就可以保存他们活动的相关信息(如标题、说明等)

当我尝试使用上面的控制器,并尝试在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

如何在一个请求中发送活动表单数据和文件?campaign对象有许多字段,因此我不想在每个表单字段的控制器参数中都添加@RequestParam。Jackson应该自动映射属性


共 (1) 个答案

  1. # 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数据都是自动映射的,不需要任何注释

    希望有帮助