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