Je développe une application basée sur Spring Boot et AngularJS en utilisant JHipster . Ma question est de savoir comment définir la taille max du téléchargement de fichiers?
Si j'essaye de télécharger dans un gros fichier, je reçois cette information dans la console:
DEBUG 11768 --- [io-8080-exec-10] c.a.app.aop.logging.LoggingAspect:
Enter: com.anuglarspring.app.web.rest.errors.ExceptionTranslator.processRuntimeException() with argument[s] =
[org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; nested exception is Java.lang.IllegalStateException:
org.Apache.Tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException: The field file exceeds its maximum permitted size of 1048576 bytes.]
Et réponse du serveur avec le statut 500.
Comment régler ça?
Également dans Spring Boot 1.4, vous pouvez ajouter les lignes suivantes à votre application.properties pour définir la limite de taille de fichier:
spring.http.multipart.max-file-size=128KB
spring.http.multipart.max-request-size=128KB
Travaillé pour moi Source: https://spring.io/guides/gs/uploading-files/
METTRE À JOUR:
Quelqu'un a demandé les différences entre les deux propriétés.
Voici les définitions formelles:
MaxFileSize: La taille maximale autorisée pour les fichiers téléchargés, en octets. Si la taille d'un fichier téléchargé est supérieure à cette taille, le conteneur Web lève une exception (IllegalStateException). La taille par défaut est illimitée.
MaxRequestSize: taille maximale autorisée pour une demande multipart/form-data, en octets. Le conteneur Web lève une exception si la taille globale de tous les fichiers téléchargés dépasse ce seuil. La taille par défaut est illimitée.
Pour expliquer chacun:
MaxFileSize: La limite pour un seul fichier à télécharger. Ceci s'applique uniquement à la limite de fichier unique.
MaxRequestSize: La limite pour la taille totale de tous les fichiers dans une seule demande de téléchargement. Ceci vérifie la limite totale. Supposons que vous ayez deux fichiers a.txt _ et b.txt_ pour une demande de téléchargement unique. a.txt est (5 Ko et b.txt est 7 Ko donc la MaxRequestSize
devrait être supérieure à 12 Ko.
Vous devez définir les paramètres multipart.maxFileSize
et multipart.maxRequestSize
sur des valeurs supérieures à celles par défaut. Cela peut être fait dans vos fichiers yml de configuration de démarrage printanier. Par exemple, ajouter les éléments suivants à application.yml
permettra aux utilisateurs de télécharger des fichiers de 10 Mo:
multipart:
maxFileSize: 10Mb
maxRequestSize: 10Mb
Si l'utilisateur doit pouvoir télécharger plusieurs fichiers en une seule demande et que leur total peut dépasser 10 Mo, vous devrez configurer multipart.maxRequestSize
sur une valeur supérieure:
multipart:
maxFileSize: 10Mb
maxRequestSize: 100Mb
Il y a une certaine différence lorsque nous définissons les propriétés dans le fichier application.properties et dans l'application yaml.
Dans application.yml:
spring:
http:
multipart:
max-file-size: 256KB
max-request-size: 256KB
Et dans application.propeties:
spring.http.multipart.max-file-size=128KB
spring.http.multipart.max-request-size=128KB
Remarque: Spring version 4.3 et Spring Boot 1.4
Dans Spring Boot 2, le spring.http.multipart
a été remplacé par spring.servlet.multipart
Pour Spring Boot 2. +, assurez-vous que vous utilisez spring.servlet
au lieu de spring.http
.
---
spring:
servlet:
multipart:
max-file-size: 10MB
max-request-size: 10MB
Si vous devez utiliser Tomcat, vous risquez de créer EmbeddedServletContainerCustomizer , ce qui n’est pas vraiment une bonne chose à faire.
Si vous pouvez vivre sans tom, vous pouvez remplacer Tomcat par exemple. sous-courant et éviter ce problème du tout.
Plus précisément, dans votre fichier de configuration application.yml
, ajoutez ce qui suit dans la section "spring:".
http:
multipart:
max-file-size: 512MB
max-request-size: 512MB
Les espaces sont importants et vous ne pouvez pas utiliser les onglets pour l'indentation .
J'ai trouvé la solution chez Expert Exchange, qui a bien fonctionné pour moi.
@Bean
public MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
factory.setMaxFileSize("124MB");
factory.setMaxRequestSize("124MB");
return factory.createMultipartConfig();
}
Ces propriétés dans spring boot application.properties rendent la taille de fichier acceptable illimitée -
# To prevent maximum upload size limit exception
spring.servlet.multipart.max-file-size=-1
spring.servlet.multipart.max-request-size=-1
Je sais que c'est très tard pour le jeu, mais je voulais poster le problème supplémentaire que j'ai rencontré lors de l'utilisation de mysql, si quelqu'un devait faire face au même problème à l'avenir.
Comme certaines des réponses mentionnées ci-dessus, leur définition dans le fichier application.properties résoudra principalement le problème.
spring.http.multipart.max-file-size=16MB
spring.http.multipart.max-request-size=16MB
Je le mets à 16 Mo, parce que j'utilise le type de données mysql MEDIUMBLOB pour stocker le fichier.
Mais après avoir corrigé le fichier application.properties, lors du téléchargement d’un fichier> 4 Mo, l’erreur suivante:. SQL [insérer dans test_doc (doc_id, duration_of_doc, doc_version_id, nom_fichier, doc) valeurs (?,?,?,?,?)]; Le paquet pour la requête est trop volumineux (6656781> 4194304). Vous pouvez modifier cette valeur sur le serveur en définissant la variable max_allowed_packet '.; L'exception imbriquée est com.mysql.jdbc.PacketTooBigException: le paquet pour la requête est trop volumineux (6656781> 4194304). Vous pouvez modifier cette valeur sur le serveur en définissant la variable max_allowed_packet '.
J'ai donc lancé cette commande depuis mysql:
SET GLOBAL max_allowed_packet = 1024*1024*16;
J'utilise spring-boot-1.3.5.RELEASE
et j'ai eu le même problème. Aucune des solutions ci-dessus ne fonctionne pas pour moi. Mais finalement, l'ajout de la propriété suivante à application.properties
a résolu le problème.
multipart.max-file-size=10MB
Si vous obtenez une erreur «Connection resets», le problème pourrait provenir de l'attribut maxSwallowSize du connecteur par défaut de Tomcat ajouté à partir de Tomcat 7.0.55 ( ChangeLog ).
De Référence de configuration Apache Tomcat 8
maxSwallowSize: Nombre maximal d'octets du corps de la demande (à l'exclusion du codage de transfert Surcharge) qui sera avalé par Tomcat pour un téléchargement interrompu. Un Le téléchargement avorté est lorsque Tomcat sait que le corps de la demande est sur le point être ignoré mais le client l’envoie quand même. Si Tomcat n’avale pas le corps du client est peu susceptible de voir la réponse. Si non spécifié la valeur par défaut de 2097152 (2 mégaoctets) sera utilisée. Une valeur de moins que zéro indique qu'aucune limite ne doit être appliquée.
Pour Tomcat intégré à Springboot, déclarer une TomcatEmbeddedServletContainerFactory
Java 8:
@Bean
public TomcatEmbeddedServletContainerFactory tomcatEmbedded() {
TomcatEmbeddedServletContainerFactory Tomcat = new TomcatEmbeddedServletContainerFactory();
Tomcat.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> {
if ((connector.getProtocolHandler() instanceof AbstractHttp11Protocol<?>)) {
//-1 for unlimited
((AbstractHttp11Protocol<?>) connector.getProtocolHandler()).setMaxSwallowSize(-1);
}
});
return Tomcat;
}
Java 7:
@Bean
public TomcatEmbeddedServletContainerFactory tomcatEmbedded() {
TomcatEmbeddedServletContainerFactory Tomcat = new TomcatEmbeddedServletContainerFactory();
Tomcat.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
if ((connector.getProtocolHandler() instanceof AbstractHttp11Protocol<?>)) {
//-1 for unlimited
((AbstractHttp11Protocol<?>) connector.getProtocolHandler()).setMaxSwallowSize(-1);
}
}
});
return Tomcat;
}
Ou dans le fichier Tomcat/conf/server.xml pour 5 Mo
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxSwallowSize="5242880" />
Aucune des configurations ci-dessus ne fonctionnait pour moi avec une application Spring.
L'implémentation de ce code dans la classe principale application (celle annotée avec @SpringBootApplication) a été efficace.
@Bean
EmbeddedServletContainerCustomizer containerCustomizer() throws Exception {
return (ConfigurableEmbeddedServletContainer container) -> {
if (container instanceof TomcatEmbeddedServletContainerFactory) {
TomcatEmbeddedServletContainerFactory Tomcat = (TomcatEmbeddedServletContainerFactory) container;
Tomcat.addConnectorCustomizers(
(connector) -> {
connector.setMaxPostSize(10000000);//10MB
}
);
}
};
}
Vous pouvez modifier la taille acceptée dans la déclaration:
connector.setMaxPostSize (10000000); // 10 Mo
Pour éviter cette exception, vous pouvez utiliser l’aide des arguments VM exactement comme j’ai utilisé dans Spring 1.5.8.RELEASE:
-Dspring.http.multipart.maxFileSize=70Mb
-Dspring.http.multipart.maxRequestSize=70Mb