2016-04-29 14 views
7

Ho un controller con un MultipartConfig un'annotazione (un frammento dei quali è esposizione qui sotto):di SpringBoot @MultipartConfig MaxFileSize non con effetto

@RestController 
@RequestMapping("packages") 
@MultipartConfig(maxFileSize = 1024*1024*1024, maxRequestSize = 1024*1024*1024) 
public class PackagesController 
{ 
    @RequestMapping(method = RequestMethod.POST) 
    public String create(@RequestParam("package") MultipartFile uploadedPackage) 
    { 
     // do stuff to the file 
     return "create"; 
    } 
} 

Quando carico un file a questo punto finale, però, sembra essere utilizzando i valori di default di configurazione più parti:

Caused by: org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException: The field package exceeds its maximum permitted size of 1048576 bytes. 
    at org.apache.tomcat.util.http.fileupload.FileUploadBase$FileItemIteratorImpl$FileItemStreamImpl$1.raiseError(FileUploadBase.java:633) ~[tomcat-embed-core-8.0.32.jar:8.0.32] 
    at org.apache.tomcat.util.http.fileupload.util.LimitedInputStream.checkLimit(LimitedInputStream.java:76) ~[tomcat-embed-core-8.0.32.jar:8.0.32] 
    at org.apache.tomcat.util.http.fileupload.util.LimitedInputStream.read(LimitedInputStream.java:135) ~[tomcat-embed-core-8.0.32.jar:8.0.32] 
    at java.io.FilterInputStream.read(FilterInputStream.java:107) ~[na:1.8.0_45] 
    at org.apache.tomcat.util.http.fileupload.util.Streams.copy(Streams.java:98) ~[tomcat-embed-core-8.0.32.jar:8.0.32] 
    at org.apache.tomcat.util.http.fileupload.util.Streams.copy(Streams.java:68) ~[tomcat-embed-core-8.0.32.jar:8.0.32] 
    at org.apache.tomcat.util.http.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:293) ~[tomcat-embed-core-8.0.32.jar:8.0.32] 
    at org.apache.catalina.connector.Request.parseParts(Request.java:2776) ~[tomcat-embed-core-8.0.32.jar:8.0.32] 
    ... 30 common frames omitted 

la mia applicazione si presenta così:

@SpringBootApplication 
public class Application { 

    public static void main(String[] args) { 
     ApplicationContext ctx = SpringApplication.run(Application.class, args); 
    } 

} 

C'è qualcosa che mi manca che consente di applicare l'annotazione @MultipartConfig?

+0

Sono riuscito a farlo funzionare utilizzando una classe AppConfig separata con un metodo MultipartConfigFactory con un'annotazione Bean, ma non sono ancora sicuro del motivo per cui non ha funzionato con l'annotazione MultipartConfig come sopra. –

+1

'@ MultipartConfig' è un'annotazione Servlet. Spring MVC non ne è a conoscenza. –

+1

Vedere [here] (http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-multipart) su come abilitare l'elaborazione multipart in Spring MVC standard. Con Boot, è un po 'diverso. –

risposta

11

Se si desidera controllare le proprietà multipart, è possibile utilizzare le proprietà multipart.max-file-size e multipart.max-request-size. Ad esempio, è possibile aumentare la dimensione massima per 100Mb aggiungendo seguente pezzo di configurazioni nel file application.properties:

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

valori possono usare il suffisso MB o KB per indicare un Megabyte o Kilobyte dimensioni.

Sotto il cofano, Primavera Boot creerà un MultipartConfigElement basata su MultipartProperties e che MultipartConfigElement sarà utilizzato in registrazione Servlet, come indicato in Spring MVC documentation. È possibile dare un'occhiata a MultipartAutoConfiguration e DispatcherServletConfiguration e Checkout Spring Boot documentation per ulteriori informazioni.

+3

Va notato che questo deve essere usato quando la versione di Spring Boot è inferiore a 1.4. Se è 1.4 o superiore, deve essere usato l'altro set di proprietà (nella risposta di @ Teebo). – cst1992

13

Con la primavera-boot 1.5.3 è necessario utilizzare il seguente codice nel application.yml

spring: 
http: 
    multipart: 
    max-file-size: 100MB 
    max-request-size: 100MB 

Assicurarsi di utilizzare gli spazi e non di tabulazione nel file YAML.

6

di definizione dei limiti personalizzati per caricamenti più parti, le proprietà che seguono sono da utilizzare (per un campione di 30 MB):

spring.http.multipart.max-file-size=30MB 
spring.http.multipart.max-request-size=30MB 

Nei progetti della nostra azienda, ho scoperto che uno di loro era su Spring Boot versione 1.3.5, quindi per le versioni 1.4 < si dovrebbe usare

multipart.max-file-size=30MB 
multipart.max-request-size=30MB 

Dal docs(v1.4.0):

Spring Boot abbraccia il servlet 3 javax.servlet.http.Part API a supporto per il caricamento di file. Per impostazione predefinita, Spring Boot configura Spring MVC con un file massimo di 1 MB per file e un massimo di 10 MB di dati di file in una singola richiesta. È possibile sovrascrivere questi valori, nonché la posizione in cui sono memorizzati i dati intermedi (ad esempio, nella directory /tmp e la soglia oltre la quale i dati vengono scaricati su disco tramite utilizzando le proprietà esposte nella classe MultipartProperties. Se si specifica che desidera che i file siano illimitati, ad esempio, impostare la proprietà spring.http.multipart.max-file-size su -1.

Il supporto più parti è utile quando si desidera ricevere più parti dati dei file codificati come parametro -annotated @RequestParam di tipo MultipartFile in un metodo del gestore di controllo Spring MVC.

Stesse documentazione per la versione 1.3.8:

Se si desidera specificare che i file siano illimitate, ad esempio, impostare la proprietà multipart.maxFileSize a -1.

2

Con Primavera Boot 2.0, è necessario utilizzare questo nella vostra application.yml

spring: 
    servlet: 
    multipart: 
     max-file-size: 100MB 
     max-request-size: 100MB 

Da documentation:

Primavera Boot abbraccia il Servlet 3 javax.servlet.http.Part API per supportare il caricamento dei file. Per impostazione predefinita, Spring Boot configura Spring MVC con una dimensione massima di 1MB per file e un massimo di 10MB di dati di file in una singola richiesta. È possibile sovrascrivere questi valori, la posizione in cui sono memorizzati i dati intermedi (ad esempio, nella directory /tmp) e la soglia oltre la quale i dati vengono scaricati su disco utilizzando le proprietà esposte nella classe MultipartProperties. Ad esempio, se si desidera specificare che i file siano illimitati, impostare la proprietà spring.servlet.multipart.max-file-size su -1.

estratto da Appendix A of documentation

spring.servlet.multipart.max-file-size = 1 MB dimensioni # massima file. I valori possono utilizzare i suffissi "MB" o "KB" per indicare rispettivamente megabyte o kilobyte.

spring.servlet.multipart.max-request-size = 10 MB # Dimensione richiesta massima. I valori possono utilizzare i suffissi "MB" o "KB" per indicare rispettivamente megabyte o kilobyte.