2014-09-05 12 views
5

Utilizzo Spring Boot 1.1.3 con CommonsMultipartResolver per consentire il caricamento di più file contemporaneamente.Come caricare più file contemporaneamente usando MultipartConfigElement in Spring Boot?

ottengo questo stacktrace quando provo a caricare un file più grandi di 1 MB:

Caused by: org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException: 
The field files[] exceeds its maximum permitted size of 1048576 bytes. 
    at org.apache.tomcat.util.http.fileupload.FileUploadBase$FileItemIteratorImpl$FileItemStreamImpl$1.raiseError(FileUploadBase.java:637) 
    at org.apache.tomcat.util.http.fileupload.util.LimitedInputStream.checkLimit(LimitedInputStream.java:76) 
    at org.apache.tomcat.util.http.fileupload.util.LimitedInputStream.read(LimitedInputStream.java:135) 
    at java.io.FilterInputStream.read(FilterInputStream.java:107) 

ho provato a fissare la dimensione di caricamento massimo in questo modo:

public MultipartResolver multipartResolver() 
{ 
    CommonsMultipartResolver resolver = new CommonsMultipartResolver(); 
    resolver.setMaxUploadSize(100 * MEGABYTE_IN_BYTES); 
    return resolver; 
} 

Tuttavia, questo non funziona . Ho trovato questo Spring guide on upoading files e lì usano invece MultipartConfigFactory. Tuttavia, ora devo utilizzare la classe MultipartFile anziché il MultipartHttpServletRequest nel mio controller.

Con il MultipartHttpServletRequest, potrei fare getFileMap() per ottenere tutti i file, ma non esiste un tale metodo su MultipartFile.

Qualche idea su come lavorare con MultipartConfigFactory e più file? Sto usando jquery-file-upload sul client se ciò fosse importante.

risposta

1

Sembra che non sia necessario utilizzare MultipartFile nel controller, è inoltre possibile utilizzare MultipartHttpServletRequest. Questa è la firma del mio @RestController classe annotata:

@RequestMapping(value = "/{datasheetId}/addDoc", method = RequestMethod.POST) 
@Secured(ROLE_USER) 
public ResponseEntity<?> addDocumentToDatasheet(Principal principal, 
               @PathVariable("datasheetId") long datasheetId, 
               MultipartHttpServletRequest request) throws IOException 
{ 
    Map<String, MultipartFile> fileMap = request.getFileMap(); 
    // handle fileMap further... 
} 
1

per il problema di portata in un mio progetto che uso di questo in application.properties:

multipart.max-file-size=100Mb 
multipart.max-request-size=100Mb 

per il caso di avere più file suggerisco di utilizzare un fagiolo come questo

@Data 
class MultipartDTO{ 

    private MultipartFile file1; 
    private MultipartFile file2; 
    ..... 
    private MultipartFile filen; 

    //eventually other proerties 
} 

poi naturalmente nel vostro controller si colud dispone di una cosa del genere

@RequestMapping(value = "/multipartUrl", method = RequestMethod.POST, consumes = "multipart/form-data") 
public ResponseEntity multipartCall(MultipartDTO multipartDTO){ 
    .... 
} 

Spero che questo può aiutare a

+0

Io uso un approccio come questo in un mio progetto open source: https://github.com/mrFlick72/socialDocumentLibrary/blob/master /book-repository-service/src/main/java/it/valeriovaudi/documentlibrary/endpoint/BookServiceEndPoint.java –

3

La domanda è stata posta per quanto riguarda la primavera Boot 1.1.3. Con il passare del tempo, le soluzioni accettate non funzionano più con le nuove versioni di Spring Boot. Tuttavia, il problema di aumentare la dimensione massima consentita per il caricamento persiste.

Sto scrivendo questo da Spring Boot 1.4.2, quindi questa soluzione potrebbe non essere corretta per sempre.

Dalla guida primavera uploading files le nuove proprietà sono quindi:

spring.http.multipart.max-file-size=10Mb 
spring.http.multipart.max-request-size=10Mb 
Problemi correlati