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?
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.
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 classeMultipartProperties
. 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.
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.
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 classeMultipartProperties
. Si vous souhaitez spécifier que les fichiers doivent être illimités, par exemple, définissezspring.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 typeMultipartFile
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
.
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
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"
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();
}