web-dev-qa-db-ja.com

ng-file-uploadを使用してSpringで多くのファイルをアップロードしようとすると、空のリスト<MultipartFile>

このブログ投稿 に触発されて複数のファイルを一度にアップロードするための次のコントローラーメソッドと この質問 への回答も持っています:

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

ただし、リクエストにはファイルが含まれていますが、ファイルのリストは常に空です。

メソッドに3番目の MultipartRequest パラメータを追加すると、次のようになります。

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

アップロードしたファイルが正しく含まれていることがわかります。

request contents

空の理由は何ですかList<MultipartFile>

ng-file-upload を使用してファイルを送信していますが、問題とは関係ないと思います。春4.2.4。

16
fracz

問題は ng-file-upload がデフォルトで_file[0]_、_file[1]_などの名前を使用してファイルの配列を送信することでした。これは arrayKeyUploadサービス使用時の値。空の文字列に設定すると、ファイルは同じfileキーの下で送信されます。これはSpringで正しく解決され、@RequestParam("file") List<MultipartFile>には送信されたすべてのファイルが含まれます。

_Upload.upload({url: url, data: {file: arrayOfFiles}, arrayKey: ''})
_
20
fracz

@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;
      }
   }
4
Abdelhak

それは私にとってはうまくいき、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

@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);
}
1
Dmitri Algazin

前面からデータを送信する方法では、Java.util.Listでboundできないと思います。 JSONデータをリクエストとして作成し、リストに@RequestBodyで注釈を付けた場合:

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

これはうまくいくはずです。一部の情報 ここ

0
alexandrum