2016-02-02 12 views
9

ho il seguente metodo di controllo per il caricamento di più file contemporaneamente, ispirato this blog post e risposte alle this question così:Lista Vuoto <MultipartFile> quando si cerca di caricare molti file in primavera con ng file-upload

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

Tuttavia, l'elenco dei file è sempre vuoto sebbene la richiesta li contenga.

Se aggiungo il terzo parametro MultipartRequest al metodo:

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

Vedo che contiene i file caricati correttamente:

request contents

Quale potrebbe essere il motivo di vuoto List<MultipartFile>?

Sto utilizzando ng-file-upload per inviare i file, ma non penso che sia collegato al problema. Primavera 4.2.4.

+0

La tua configurazione? Hai bisogno di una libreria e un risolutore corrispondente per i caricamenti multipart. – zeroflagL

+0

Cosa * libreria *? – fracz

+0

Ho pensato che leggessi il post sul blog a cui ti riferivi. 'commons-fileupload' ad es. – zeroflagL

risposta

14

Il problema era che ng-file-upload di default sostiene serie di file con nomi file[0], file[1] ecc E 'configurabile con il valore arrayKey quando si utilizza Upload servizio. Impostandolo su una stringa vuota impone che i file vengano inviati con la stessa chiave file, che viene risolta correttamente con Spring e lo @RequestParam("file") List<MultipartFile> contiene tutti i file che sono stati inviati.

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

tenta di utilizzare @ModelAttribute come questo:

@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(); 
    ... 

E creare una classe come:

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

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

Ma voglio caricare più file contemporaneamente. – fracz

+0

@fracz vedere la risposta aggiornata – Abdelhak

0

Credo che nel modo in cui hai inviato i dati dalla parte anteriore, non può vincolati con java.util.List. Se si crea un insieme di dati JSON come richiesta e annotata la vostra lista con @RequestBody come:

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

questo dovrebbe funzionare. Alcune informazioni here.

+0

Non ha funzionato out-the-box per me, ma preferisco l'approccio. Finito con il metodo @francz sopra. – Spider

+0

La soluzione che tu proponi con @RequestBody è, infatti, corretta quando il corpo della richiesta ha una traduzione diretta in un oggetto di dominio che hai sul back-end. Ad esempio, può essere utilizzato per analizzare il corpo dai dati JSON a un oggetto. Tuttavia, non funzionerà con MultipartFile. –

Problemi correlati