web-dev-qa-db-fra.com

@MultipartConfig maxFileSize de SpringBoot ne prend pas effet

J'ai un contrôleur avec une annotation MultipartConfig (dont un extrait est montré ci-dessous):

@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";
    }
}

Cependant, lorsque je télécharge un fichier sur ce point de terminaison, il semble utiliser les valeurs de configuration par défaut en plusieurs parties:

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

Mon application ressemble à ceci:

@SpringBootApplication
public class Application {

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

}

Y a-t-il quelque chose qui me manque qui permet à @MultipartConfig annotation pour prendre effet?

26
Nic Wolfe

Si vous souhaitez simplement contrôler les propriétés en plusieurs parties, vous pouvez utiliser multipart.max-file-size et multipart.max-request-size Propriétés. Par exemple, vous pouvez augmenter la taille maximale à 100Mb en ajoutant la configuration suivante dans votre application.properties fichier:

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

Les valeurs peuvent utiliser le suffixe MB ou KB pour indiquer un mégaoctet ou Kilo-octet taille.

Sous le capot, Spring Boot créera un MultipartConfigElement basé sur MultipartProperties et que MultipartConfigElement sera utilisé dans l'enregistrement du servlet, comme indiqué dans documentation Spring MVC =. Vous pouvez consulter MultipartAutoConfiguration et DispatcherServletConfiguration et Checkout documentation Spring Boot pour plus d'informations.

21
Ali Dehghani

Avec Spring Boot 2.0, vous devez l'utiliser dans votre application.yml

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

De documentation :

Spring Boot embrasse le Servlet 3 javax.servlet.http.Part API pour prendre en charge le téléchargement de fichiers. Par défaut, Spring Boot configure Spring MVC avec une taille maximale de 1 Mo par fichier et un maximum de 10 Mo de données de fichier en une seule demande. Vous pouvez remplacer ces valeurs, l'emplacement dans lequel les données intermédiaires sont stockées (par exemple, dans le /tmp) et le seuil au-delà duquel les données sont vidées sur le disque en utilisant les propriétés exposées dans la classe MultipartProperties. Par exemple, si vous souhaitez spécifier que les fichiers doivent être illimités, définissez la propriété spring.servlet.multipart.max-file-size sur -1.

Extrait de Annexe A de la documentation

spring.servlet.multipart.max-file-size = 1MB # Taille maximale du fichier. Les valeurs peuvent utiliser les suffixes "Mo" ou "Ko" pour indiquer respectivement des mégaoctets ou des kilo-octets.

spring.servlet.multipart.max-request-size = 10 Mo # Taille maximale de la demande. Les valeurs peuvent utiliser les suffixes "Mo" ou "Ko" pour indiquer respectivement des mégaoctets ou des kilo-octets.

26
T4keo

Avec Spring-boot 1.5.3, vous devez utiliser le code suivant dans application.yml

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

Assurez-vous d'utiliser des espaces et non des tabulations dans votre fichier yaml.

25
tla

Pour définir des limites personnalisées pour les téléchargements en plusieurs parties, les propriétés ci-dessous doivent être utilisées (pour un échantillon de 30 Mo):

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

Dans les projets de notre entreprise, j'ai trouvé que l'un d'entre eux était sur Spring Boot version 1.3.5, donc pour les versions <1.4, vous devriez utiliser

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

Depuis docs (v1.4.0) :

Spring Boot embrasse le Servlet 3 javax.servlet.http.Part API pour prendre en charge le téléchargement de fichiers. Par défaut, Spring Boot configure Spring MVC avec un fichier maximal de 1 Mo par fichier et un maximum de 10 Mo de données de fichier en une seule demande. Vous pouvez remplacer ces valeurs, ainsi que l'emplacement dans lequel les données intermédiaires sont stockées (par exemple, dans le /tmp) et le seuil au-delà duquel les données sont vidées sur le disque en utilisant les propriétés exposées dans la classe MultipartProperties. Si vous souhaitez spécifier que les fichiers doivent être illimités, par exemple, définissez spring.http.multipart.max-file-size propriété à -1.

La prise en charge de plusieurs parties est utile lorsque vous souhaitez recevoir des données de fichiers codés en plusieurs parties sous la forme d'un @RequestParam- paramètre annoté de type MultipartFile dans une méthode de gestionnaire de contrôleur Spring MVC.

Mêmes documents pour la version 1.3.8:

Si vous souhaitez spécifier que les fichiers doivent être illimités, par exemple, définissez multipart.maxFileSize propriété à -1.

20
cst1992

Pour Spring Boot v2 +, ajoutez les éléments suivants à application.properties:

spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=40MB
10
user1188867

Lors du déploiement, où les valeurs sont insérées via le script jenkins, aucun "-" n'est autorisé. Utilisation:

env:
  - name: SPRING_SERVLET_MULTIPART_MAXREQUESTSIZE
    value: "10MB"
  - name: SPRING_SERVLE
    value: "10MB"
0
theshadog

La propriété d'application est une option. Une autre option est

@Bean
public MultipartConfigElement multipartConfigElement() {
  MultipartConfigFactory factory = new MultipartConfigFactory();
  factory.setMaxFileSize("10MB");
  factory.setMaxRequestSize("10MB");
  return factory.createMultipartConfig();
}
0
user1941489