Comment définir la taille maximale de téléchargement de fichiers
je développe une application basée sur la botte à ressort et AngularJS en utilisant JHipster. Ma question Est de savoir comment définir taille maximale des fichiers de téléchargement ?
si j'essaie de télécharger vers 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 statut 500.
Comment régler ça?
12 réponses
également dans la botte de printemps 1.4, vous pouvez ajouter les lignes suivantes à votre application.propriétés pour définir la limite de taille du fichier:
spring.http.multipart.max-file-size=128KB
spring.http.multipart.max-request-size=128KB
travaillait pour moi. Source: https://spring.io/guides/gs/uploading-files /
vous devez définir les paramètres multipart.maxFileSize
et multipart.maxRequestSize
à des valeurs plus élevées que la valeur par défaut. Cela peut être fait dans vos fichiers de configuration de démarrage de printemps yml. Par exemple, l'ajout de ce qui suit à application.yml
permettra aux utilisateurs de télécharger des fichiers de 10 Mo:
multipart:
maxFileSize: 10Mb
maxRequestSize: 10Mb
si l'Utilisateur a besoin de pouvoir télécharger plusieurs fichiers dans une seule requête et qu'ils peuvent totaliser plus de 10 Mo, alors vous devrez configurer multipart.maxRequestSize
à une valeur plus élevée:
multipart:
maxFileSize: 10Mb
maxRequestSize: 100Mb
il y a une différence lorsque nous définissons les propriétés dans l'application.propriétés et application yaml.
en application.yml:
spring:
http:
multipart:
max-file-size: 256KB
max-request-size: 256KB
et en application.propeties:
spring.http.multipart.max-file-size=128KB
spring.http.multipart.max-request-size=128KB
Note: version à ressort 4.3 et botte à ressort 1.4
dans la botte de printemps 2 le spring.http.multipart
changé en spring.servlet.multipart
plus précisément, dans votre fichier de configuration application.yml
, ajoutez ce qui suit à la section" spring:".
http:
multipart:
max-file-size: 512MB
max-request-size: 512MB
espace blanc est important et vous ne peut pas utiliser les onglets pour l'indentation .
Pour Botte De Printemps 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 pourriez finir par créer EmbeddedServletContainerCustomizer , ce qui n'est pas vraiment une bonne chose à faire.
si vous pouvez vivre sans tomat, vous pouvez remplacer tomcat avec par exemple sous-entendu et éviter ce problème du tout.
je sais que c'est extrêmement tard pour le jeu, mais je voulais poster le problème supplémentaire que j'ai rencontré en utilisant mysql, si quelqu'un fait face à la même question à l'avenir.
comme certaines des réponses mentionnées ci-dessus, le réglage de ces derniers dans la demande.propriétés sera la plupart du temps de résoudre 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 mysql MEDIUMBLOB datatype pour stocker le fichier.
mais après avoir fixé le application.propriétés, lors du chargement d'un fichier > 4MB a donné l'erreur: org.springframework.dao.TransientDataAccessResourceException: PreparedStatementCallback; SQL [insert into test_doc (doc_id, duration_of_doc, doc_version_id, file_name, doc) values (?, ?, ?, ?, ?)]; Le paquet de requête est trop grand (6656781 > 4194304). Vous pouvez modifier cette valeur sur le serveur en paramétrant la variable max_allowed_packet'.; l'exception imbriquée est com.mysql.jdbc.PacketTooBigException: le paquet pour la requête est trop grand (6656781 > 4194304). Vous pouvez modifier cette valeur sur le serveur en paramétrant la variable max_allowed_packet'.
alors j'ai lancé cette commande de mysql:
SET GLOBAL max_allowed_packet = 1024*1024*16;
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 l'application de botte de printemps.propriétés rend la taille de fichier acceptable illimité -
# To prevent maximum upload size limit exception
spring.servlet.multipart.max-file-size=-1
spring.servlet.multipart.max-request-size=-1
si vous obtenez une erreur" connection resets", le problème pourrait être dans le connecteur par défaut Tomcat maxSwallowSize attribut ajouté à partir de Tomcat 7.0.55 ( ChangeLog )
De Apache Tomcat 8 Référence De Configuration
maxSwallowSize : Le nombre maximum d'octets de corps de requête (à l'exclusion de l'encodage de transfert) les frais généraux) qui sera avalé par Tomcat pour un téléchargement avorté. Un abandonnée télécharger, c'est quand Tomcat sait que le corps de la requête va être ignoré mais le client l'envoie quand même. Si Tomcat n'avale pas le corps, le client est peu probable 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 de que zéro indique qu'aucune limite doit être appliquée.
pour poutrelles encastrées Tomcat déclarer un Tomcatembeddedservlet containerfactory
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 Tomcat/conf/server.xml pour 5MB
<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 de ressort.
implémentant ce code dans la classe principale application (celle annotée avec @SpringBootApplication) a fait l'affaire.
@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 changer la taille acceptée dans la déclaration:
connecteur.setMaxPostSize (10000000);//10MB
j'utilise spring-boot-1.3.5.RELEASE
et j'ai eu le même problème. Aucune des solutions ci-dessus ne me convient. Mais finalement ajouter la propriété suivante à application.properties
a été corrigé le problème.
multipart.max-file-size=10MB