web-dev-qa-db-fra.com

Augmenter HTTP Post maxPostSize dans Spring Boot

J'ai une application Web Spring Boot assez simple, j'ai une seule page HTML avec un formulaire avec enctype="multipart/form-data". Je reçois cette erreur:

La demande en plusieurs parties contenait des données de paramètre (à l’exclusion des fichiers téléchargés) qui dépassaient la limite définie pour maxPostSize sur le connecteur associé.

J'utilise le serveur Tomcat intégré par défaut de Spring Boot. Apparemment, la valeur par défaut de maxPostSize est de 2 mégaoctets. Est-il possible de modifier cette valeur? Ce faisant via application.properties _ serait préférable, plutôt que de créer des beans personnalisés ou de jouer avec des fichiers XML.

37
Jordan

Trouvé une solution. Ajoutez ce code à la même classe exécutant SpringApplication.run.

// Set maxPostSize of embedded Tomcat server to 10 megabytes (default is 2 MB, not large enough to support file uploads > 1.5 MB)
@Bean
EmbeddedServletContainerCustomizer containerCustomizer() throws Exception {
    return (ConfigurableEmbeddedServletContainer container) -> {
        if (container instanceof TomcatEmbeddedServletContainerFactory) {
            TomcatEmbeddedServletContainerFactory Tomcat = (TomcatEmbeddedServletContainerFactory) container;
            Tomcat.addConnectorCustomizers(
                (connector) -> {
                    connector.setMaxPostSize(10000000); // 10 MB
                }
            );
        }
    };
}

Modifier: Apparemment, ajouter ceci à votre fichier application.properties augmentera également maxPostSize, mais je ne l’ai pas essayé moi-même, je ne peux donc pas confirmer.

multipart.maxFileSize=10Mb # Max file size.
multipart.maxRequestSize=10Mb # Max request size.
16
Jordan

Dans le fichier application.properties , écrivez ceci:

# Max file size.
spring.http.multipart.max-file-size=1Mb
# Max request size.
spring.http.multipart.max-request-size=10Mb

ajustez la taille en fonction de vos besoins.

Mettre à jour

Remarque: À partir de Spring Boot 2, comme vous pouvez maintenant le faire

# Max file size.
spring.servlet.multipart.max-file-size=1MB
# Max request size.
spring.servlet.multipart.max-request-size=10MB

Annexe A. Propriétés d'application communes - Spring

38
Sanjay Singh Rawat

Si vous utilisez le type de média x-www-form-urlencoded dans vos POST (comme je le fais), la propriété multipart de spring-boot ne fonctionne pas. Si votre application spring-boot démarre également Tomcat, vous devez définir la propriété suivante dans votre fichier application.properties:

# Setting max size of post requests to 6MB (default: 2MB)
server.Tomcat.max-http-post-size=6291456

Je n'ai pu trouver cette information nulle part dans les documentations printanières. J'espère que cela aidera tous ceux qui s'en tiennent à l'encodage x-www-form-urlencoded du corps.

10
Fabi Ko

depuis la documentation: https://spring.io/guides/gs/uploading-files/

Réglage des limites de téléchargement de fichier

Lors de la configuration des téléchargements de fichiers, il est souvent utile de définir des limites pour la taille des fichiers. Imaginez que vous essayez de gérer un téléchargement de fichier de 5 Go! Avec Spring Boot, nous pouvons ajuster son MultipartConfigElement auto-configuré avec certains paramètres de propriété.

Ajoutez les propriétés suivantes à votre src/main/resources/application.properties Existant:

spring.http.multipart.max-file-size=128KB

spring.http.multipart.max-request-size=128KB

Les paramètres en plusieurs parties sont contraints comme suit:

  • spring.http.multipart.max-file-size is set to 128KB, Ce qui signifie que la taille totale du fichier ne peut dépasser 128 Ko.

  • spring.http.multipart.max-request-size Est réglé sur 128 Ko, ce qui signifie que la taille totale de la demande pour une donnée multipart/form ne peut pas dépasser 128 Ko.

5
Dániel Kis

Il y a une certaine différence quand on définit les propriétés dans le application.yaml et application.properties.

Dans 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

Remarque: Spring version 4.3 et Spring Boot 1.4

4
denzal

Tout d’abord, 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 tomates, vous pouvez remplacer Tomcat par exemple. resserrer et éviter ce problème du tout.

3
Ondrej Kvasnovsky

Pour moi, rien des travaux précédents (utiliser l’application avec yaml est peut-être un problème ici), mais résolvez-le en utilisant ceci:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.annotation.Bean;
import org.springframework.util.unit.DataSize;

import javax.servlet.MultipartConfigElement;

@ServletComponentScan
@SpringBootApplication
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }

    @Bean
    MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        factory.setMaxFileSize(DataSize.ofBytes(512000000L));
        factory.setMaxRequestSize(DataSize.ofBytes(512000000L));
        return factory.createMultipartConfig();
    }
}
0
user11999314

Appliquer les paramètres pour Tomcat ainsi que pour le servlet

Vous pouvez définir la taille de publication maximale pour Tomcat dans application.properties qui est défini avec un int comme ci-dessous. Je viens de mettre spring.servlet.multipart.max-request-size=10MB, comme dans d’autres réponses, peut ne pas suffire.

spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
server.Tomcat.max-http-post-size=100000000
server.Tomcat.max-swallow-size=100000000

Travailler avec Spring Boot 2.0.5.RELEASE

0
Steve Banton

Aucune des solutions n’a fonctionné pour moi et la plupart d’entre elles sont carrément offtopic car OP parle de maxPostSize, et non maxFileSize (ce dernier vous donne quand même une erreur différente si le la taille est dépassée)

Solution: dans /Tomcat/conf/server.xml, ajouter l'attribut maxPostSize = "" au connecteur

<!-- A "Connector" represents an endpoint by which requests are received
     and responses are returned. Documentation at :
     Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
     Java AJP  Connector: /docs/config/ajp.html
     APR (HTTP/AJP) Connector: /docs/apr.html
     Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
-->
<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           maxPostSize="10485760"
           redirectPort="8443" />
0
spiritworld