web-dev-qa-db-fra.com

Comment définir la taille maximale du fichier de téléchargement

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?

38
Michał Styś

É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.

54
Bahadir Tasdemir

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

Source: https://spring.io/guides/gs/uploading-files/

17
geraldhumphries

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

14
denzal

Dans Spring Boot 2, le spring.http.multipart a été remplacé par spring.servlet.multipart

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0.0-M1-Release-Notes#multipart-configuration

13
Allar Saarnak

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. 

9
Ondrej Kvasnovsky

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 .

5
MobileMateo

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();
}

Réf: https://www.experts-exchange.com/questions/28990849/How-to-increase-Spring-boot-Tomcat-max-file-upload-size.html

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
3
thedevd

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;
2
she12

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
2

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" />
1
Alex

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

0
Tomer Shay

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
0
Khushboo Sharma