【问题标题】:Upload multiple files with additional information (Spring RestController)上传带有附加信息的多个文件(Spring RestController)
【发布时间】:2019-10-14 09:11:53
【问题描述】:

我知道有很多questions 涵盖该主题,但我不知道如何实现以下要求。

我想上传一个文件列表,每个文件都包含一些额外信息。 在 Java 世界中,这意味着以下内容:

@NoArgsConstructor
@Getter
public class SkillsVerificationData {

   String type; // this information is related to the file 
   MultipartFile file;
}

问题 1: RestController 是否可以使用包装器对象实现这样的映射? (参见引用问题的第一个答案-@ModelAttribute)

问题 2: 使用上面提到的问题中回答的以下控制器方法

@RequestMapping(value = "/upload", method = RequestMethod.POST, consumes = { "multipart/form-data" })
public void upload(@RequestPart("type") @Valid String type,
        @RequestPart("file") @Valid @NotNull @NotBlank MultipartFile file) {
}

我假设它适用于单个文件。应该如何定义/描述请求部分以实现上传 List<SkillsVerificationData>SkillsVerificationData[] ?

请注意,客户端使用FormData 发送信息。

提前致谢!

【问题讨论】:

    标签: java spring spring-boot http


    【解决方案1】:

    如果我正确理解您的问题,您希望上传文件列表以及每个文件的特定信息。我可以与一个例子相关联,以提高清晰度。用户想要上传候选人的技术资料或简历列表以及候选人信息。如果是这种情况,您可以创建一个 MultiPart 文件数组和一个 json 结构,其中包含有关每个唯一文件名的信息,以及 json 结构中的唯一 id 和候选信息。如果这是要求,您可以参考下面的代码。

    @PostMapping(
          value = "/multiUpload",
          consumes = {MediaType.MULTIPART_FORM_DATA_VALUE},
          produces = MediaType.TEXT_PLAIN_VALUE)
      public ResponseEntity<?> uploadingMultipleFiles(
          @RequestParam("files") MultipartFile[] uploadingFiles, @RequestPart(value = "emps", required = true) String empJsonTxt) {
          System.out.println("EMP as Json String = " + empJsonTxt);
          //Process the empJsonTxt
        ObjectMapper objectMapper = new ObjectMapper();
        try {
          Employee emp = objectMapper.readValue(empJsonTxt, Employee.class);
          System.out.println("Now emp = " + emp);
        } catch (IOException e) {
          e.printStackTrace();
        }
        for (MultipartFile uploadedFile : uploadingFiles) {
          System.out.println("Uploaded File Name = " + uploadedFile.getOriginalFilename());
          File file = new File("E:/sure-delete/" + uploadedFile.getOriginalFilename());
    
        //Upload functionality
          try {
            uploadedFile.transferTo(file);
          } catch (IOException e) {
            e.printStackTrace();
          }
        }
        return ResponseEntity.ok("All Files uploaded successfully ...");
      }
    

    在这种情况下,empJsonTxt 是一串 json 内容,其中包含有关员工及其简历/个人资料的所有必需信息。多部分文件将仅用于上传。但是,您可以推断这部分以使其适合您的要求。这是可行的,可能还有更多好的方法。

    【讨论】:

    • 嘿 Sambit,感谢您的回复,我更新了我的问题以使其更清楚。这种文件和文件名之间的映射(它们属于一起)将是非常必要的。
    • 如果你想单文件上传有额外的信息,可以实现。当您上传包含额外信息的多个文件时,它会变得复杂。有很多答案,但有些不起作用。我在我的项目中尝试了这个,它奏效了。希望我的信息对你有用。
    • 我最终实现了一个类似于你的解决方案,因为我认为不可能为每个请求部分定义内容类型。这就是这种情况下的问题。如果您修改答案以回答我的问题,我也会接受。
    猜你喜欢
    • 2021-12-03
    • 1970-01-01
    • 2015-05-26
    • 2020-07-09
    • 2020-03-15
    • 2021-12-04
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多