简体   繁体   English

空列表<MultipartFile>尝试使用 ng-file-upload 在 Spring 中上传许多文件时

[英]Empty List<MultipartFile> when trying to upload many files in Spring with ng-file-upload

I have the following controller method for uploading multiple files at once, inspired by this blog post and answers to this question as well:我有以下控制器方法可以一次上传多个文件,灵感来自这篇博客文章这个问题的答案:

@RequestMapping(value = "/{user}/attachment", method = RequestMethod.POST)
@PreAuthorize(...)
public void upload(@PathVariable User user, 
                   @RequestParam("file") List<MultipartFile> files) {
  // handle files
}

However, the list of the files is always empty although request contains them.但是,尽管请求包含文件,但文件列表始终为空。

If I add the third MultipartRequest parameter to the method:如果我将第三个MultipartRequest参数添加到方法中:

public void upload(@PathVariable User user, 
                   @RequestParam("file") List<MultipartFile> files,
                   MultipartRequest request)

I can see it contains my uploaded files correctly:我可以看到它正确包含我上传的文件:

请求内容

What might be the reason of empty List<MultipartFile> ?List<MultipartFile>的原因可能是什么?

I'm using ng-file-upload to submit the files, but I don't think it is connected with the issue.我正在使用ng-file-upload提交文件,但我认为它与问题无关。 Spring 4.2.4.春天 4.2.4。

The problem was that ng-file-upload by default submits array of files using names file[0] , file[1] etc. It is configurable with the arrayKey value when using Upload Service.问题是ng-file-upload默认使用名称file[0]file[1]等提交文件数组。使用Upload服务时,它可以使用arrayKey值进行配置。 Setting it to empty string forces the files to be sent under the same file key, which is correctly resolved with Spring and the @RequestParam("file") List<MultipartFile> contains all files that has been submitted.将其设置为空字符串会强制文件在相同的file键下发送,Spring 正确解析了这一点,@ @RequestParam("file") List<MultipartFile>包含已提交的所有文件。

Upload.upload({url: url, data: {file: arrayOfFiles}, arrayKey: ''})

Try to use @ModelAttribute like this:尝试像这样使用@ModelAttribute

    @RequestMapping(value = "/{user}/attachment", method = RequestMethod.POST)
    @PreAuthorize(...) 
    public void upload(@PathVariable User user,@ModelAttribute("uploadFile") FileUpload uploadFile) throws IllegalStateException, IOException {

    List<MultipartFile> files = uploadFile.getFiles();
    ...

And create a class like:并创建一个类,如:

     public class FileUpload {
     private List<MultipartFile> files;
     public List<MultipartFile> getFiles() {
        return files;
     }

    public void setFiles(List<MultipartFile> files) {
       this.files= files;
      }
   }

That works for me, sending big 'email' object with multiple file attachments from UI to back-end:这对我有用,将带有多个文件附件的大“电子邮件”对象从 UI 发送到后端:

Angular

sendEmailWithAttachments(taskId: string, template: string, email: any, modelConfig: any, files: any[]) {
    let formData = new FormData();
    formData.append('form', new Blob([JSON.stringify(email)], {type: 'application/json'}));
    files.forEach(file  => {
        formData.append('files', file);
    });

    return this.$http({
        method: 'POST',
        data: formData,
        url: this.baseUrl + '/' + taskId + '/email-with-attachment?template=' + template,
        headers: {
            'Content-Type': undefined
        },
        responseType: 'arraybuffer'
    });
}

Java Spring Java 春天

@RequestMapping(value = "{taskId}/email-with-attachment", method = RequestMethod.POST, consumes = MULTIPART_FORM_DATA_VALUE)
public void sendEmailWithAttachment(
        @PathVariable String taskId,
        @RequestParam String template,
        @RequestParam("form") MultipartFile form,
        @RequestParam("files") List<MultipartFile> files) throws IOException {
    Map<String, String> parameters = new ObjectMapper().readValue(form.getInputStream(), HashMap.class);
    
    System.out.println("taskId"+ taskId);
    System.out.println("template"+ template);
    System.out.println("files"+ files);
    System.out.println("parameters"+ parameters);
}

for multiple files.对于多个文件。 do this in your javascript在您的 javascript 中执行此操作

//first add files to form data
var formData = new FormData();
for (let i = 0; i < files.length; i++) {
    formData.append("images", files[i]);
}

//post files to backend e.g using angular
 $http.post('upload', formData, {
     transformRequest: angular.identity,
     headers: {'Content-Type': undefined}
 })
 .then(function(response){
      console.log("UPLOAD COMPLETE::=> ", response);
 }, function (error) {
      console.log(error);
 });

Do this in your java在你的java中做这个

//your java method signature
@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE )
public Response uploadImage(RequestParam(value = "images") MultipartFile[] images){

}

I think that in the way you sent data from front, it can not bound with java.util.List.我认为在您从前面发送数据的方式中,它不能与 java.util.List绑定 If you create a JSON data as request and you annotated your List with @RequestBody like:如果您创建一个 JSON 数据作为请求并使用 @RequestBody 注释您的列表,例如:

@RequestMapping(value = "/{user}/attachment", method = RequestMethod.POST)
@PreAuthorize(...)
public void upload(@PathVariable User user, 
                   @RequestBody List<MultipartFile> files) {
  // handle files
}

this should work.这应该有效。 Some info here .一些信息在这里

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 使用 ng-file-upload 和 Spring Boot 上传文件 - Upload file using ng-file-upload and Spring Boot Spring MultipartFile上传文件位置 - Spring MultipartFile upload file location 上传文件时,Spring REST MultipartFile文件始终为null - Spring REST MultipartFile file is always null when do upload file 尝试上传文件时,所需的MultipartFile参数&#39;file&#39;不存在错误 - Required MultipartFile parameter 'file' is not present error when trying upload a file Spring 3.0 MultipartFile上传 - Spring 3.0 MultipartFile upload 在 spring 引导中使用 vs-upload 上传文件时,MultipartFile 收到 null - MultipartFile recieved null when using vs-upload to upload file in spring boot 使用MultipartFile的多个文件上传在Spring Boot中不起作用,从JSP在Controller中获取空数组 - Multiple file upload using MultipartFile not working in Spring Boot , getting empty array in Controller from JSP Spring Cloud Feign MultipartFile上传 - Spring Cloud Feign MultipartFile upload Spring + ExtJS 文件上传所需的 MultipartFile 参数“文件”不存在 - Spring + ExtJS File Upload Required MultipartFile parameter 'file' is not present 在Spring 2.5中使用MultipartFile上传文件中的null值 - null value in file upload by using MultipartFile in spring 2.5
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM