복붙노트

[SPRING] ng-file-upload를 사용하여 Spring에서 많은 파일을 업로드하려고 할 때 빈 목록 <MultipartFile>

SPRING

ng-file-upload를 사용하여 Spring에서 많은 파일을 업로드하려고 할 때 빈 목록

한 번에 여러 파일을 업로드 할 수있는 다음 컨트롤러 메서드가 있습니다.이 블로그 게시물과이 질문에 대한 답변에서 영감을 얻었습니다.

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

그러나 요청에 포함되어 있지만 파일 목록은 항상 비어 있습니다.

세 번째 MultipartRequest 매개 변수를 메서드에 추가하면 :

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

업로드 된 파일이 올바르게 표시됩니다.

빈 List 의 이유는 무엇입니까?

파일을 제출하기 위해 ng-file-upload를 사용하고 있지만 문제와 관련이 있다고 생각하지 않습니다. 봄 4.2.4.

해결법

  1. ==============================

    1.문제는 기본적으로 ng-file-upload가 이름 파일 [0], 파일 [1] 등을 사용하여 파일 배열을 제출한다는 것입니다. 업로드 서비스를 사용하는 경우 arrayKey 값으로 구성 할 수 있습니다. 빈 문자열로 설정하면 파일이 Spring과 @RequestParam ( "file") List 에 제출 된 모든 파일을 포함하는 동일한 파일 키로 강제 전송됩니다.

    문제는 기본적으로 ng-file-upload가 이름 파일 [0], 파일 [1] 등을 사용하여 파일 배열을 제출한다는 것입니다. 업로드 서비스를 사용하는 경우 arrayKey 값으로 구성 할 수 있습니다. 빈 문자열로 설정하면 파일이 Spring과 @RequestParam ( "file") List 에 제출 된 모든 파일을 포함하는 동일한 파일 키로 강제 전송됩니다.

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

    2.다음과 같이 @ModelAttribute를 사용하십시오.

    다음과 같이 @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();
        ...
    

    다음과 같은 클래스를 만듭니다.

         public class FileUpload {
         private List<MultipartFile> files;
         public List<MultipartFile> getFiles() {
            return files;
         }
    
        public void setFiles(List<MultipartFile> files) {
           this.files= files;
          }
       }
    
  3. ==============================

    3.나는 당신이 정면에서 데이터를 보내는 방식으로 java.util.List와 바인딩 할 수 없다고 생각한다. 요청으로 JSON 데이터를 만들고 @RequestBody로 List에 주석을 추가 한 경우 :

    나는 당신이 정면에서 데이터를 보내는 방식으로 java.util.List와 바인딩 할 수 없다고 생각한다. 요청으로 JSON 데이터를 만들고 @RequestBody로 List에 주석을 추가 한 경우 :

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

    이게 효과가있다. 여기에 몇 가지 정보가 있습니다.

  4. ==============================

    4.그것은 저에게 효과적입니다. UI에서 백엔드로 여러 첨부 파일이 포함 된 큰 '이메일'개체를 보냅니다.

    그것은 저에게 효과적입니다. UI에서 백엔드로 여러 첨부 파일이 포함 된 큰 '이메일'개체를 보냅니다.

    모난

    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

    @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);
    }
    
  5. from https://stackoverflow.com/questions/35160483/empty-listmultipartfile-when-trying-to-upload-many-files-in-spring-with-ng-fil by cc-by-sa and MIT license