Ich entwickle eine Anwendung basierend auf Spring Boot und AngularJS mit JHipster. Meine Frage ist, wie man die maximale Größe des Hochladens von Dateien festlegt.
Wenn ich versuche, in eine große Datei hochzuladen, erhalte ich diese Informationen in der Konsole:
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.]
Und Serverantwort mit Status 500.
Wie stelle ich das ein?
quelle
spring.servlet.multipart.max-file-size = 5MB spring.servlet.multipart.max-request-size = 5MB
max-file-size
undmax-request-size
?max-file-size
-> maximale Größe für das Hochladen einer einzelnen Datei.max-request-size
-> das Limit für die Gesamtgröße aller Dateien in einer einzelnen Upload-Anfrage. Damit; Wenn Sie die Upload-Größe erhöhen möchten, müssen Sie beide Werte erhöhen, da einer für ein einzelnes Dateilimit und einer für die Gesamtgröße aller Dateien in einer einzelnen Anforderung gilt.spring.servlet.multipart.max-file-size = 5MB spring.servlet.multipart.max-request-size = 5MB
Eigenschaften des Gateways hinzufügenIn Spring Boot 2 wurde das
spring.http.multipart
geändertspring.servlet.multipart
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0.0-M1-Release-Notes#multipart-configuration
quelle
Stellen Sie für Spring Boot 2. + sicher, dass Sie
spring.servlet
anstelle von verwendenspring.http
.Wenn Sie Tomcat verwenden müssen, erstellen Sie möglicherweise EmbeddedServletContainerCustomizer , was nicht wirklich hilfreich ist.
Wenn Sie ohne Tomate leben können, können Sie Tomcat durch zB Sog ersetzen und dieses Problem überhaupt vermeiden.
quelle
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
Sie müssen die Parameter
multipart.maxFileSize
undmultipart.maxRequestSize
auf höhere Werte als die Standardwerte einstellen . Dies kann in den yml-Dateien Ihrer Spring Boot-Konfiguration erfolgen. Wenn Sie beispielsweise Folgendes hinzufügen,application.yml
können Benutzer 10-MB-Dateien hochladen:Wenn der Benutzer in der Lage sein muss, mehrere Dateien in einer einzigen Anforderung hochzuladen und diese insgesamt mehr als 10 MB umfassen können, müssen Sie
multipart.maxRequestSize
einen höheren Wert konfigurieren :Quelle: https://spring.io/guides/gs/uploading-files/
quelle
Es gibt einige Unterschiede, wenn wir die Eigenschaften in application.properties und application yaml definieren.
In application.yml:
Und in application.propeties:
Hinweis: Spring Version 4.3 und Spring Boot 1.4
quelle
In
spring 2.x
. Die Optionen haben sich geringfügig geändert. Die obigen Antworten sind also fast richtig, aber nicht vollständig. Fügen Sie in Ihrerapplication.properties
Datei Folgendes hinzu:quelle
Fügen Sie in Ihrer
application.yml
Konfigurationsdatei im Abschnitt "spring:" Folgendes hinzu.Leerzeichen sind wichtig und Sie können keine Tabulatoren zum Einrücken verwenden .
quelle
application.yml
wird sie durch einfaches Hinzufügen zu beiden Profilen kaskadiert, sodass Sie sie nicht zweimal festlegen müssen.Diese Eigenschaften in Spring Boot Application.properties machen die akzeptable Dateigröße unbegrenzt -
quelle
Ich habe die Lösung bei Expert Exchange gefunden, was für mich gut funktioniert hat.
@Bean public MultipartConfigElement multipartConfigElement() { MultipartConfigFactory factory = new MultipartConfigFactory(); factory.setMaxFileSize("124MB"); factory.setMaxRequestSize("124MB"); return factory.createMultipartConfig(); }
Ref: https://www.experts-exchange.com/questions/28990849/How-to-increase-Spring-boot-Tomcat-max-file-upload-size.html
quelle
Ich benutze
spring-boot-1.3.5.RELEASE
und ich hatte das gleiche Problem. Keine der oben genannten Lösungen funktioniert bei mir nicht. Aber schließlichapplication.properties
wurde das Problem behoben, indem folgende Eigenschaft hinzugefügt wurde.quelle
Ich weiß, dass dies extrem spät im Spiel ist, aber ich wollte das zusätzliche Problem veröffentlichen, mit dem ich bei der Verwendung von MySQL konfrontiert war, wenn jemand in Zukunft mit demselben Problem konfrontiert ist.
Wie einige der oben genannten Antworten, wird das Problem meistens behoben, wenn Sie diese in der application.properties festlegen
Ich setze es auf 16 MB, weil ich den Datentyp mysql MEDIUMBLOB zum Speichern der Datei verwende.
Nach dem Korrigieren der application.properties wurde beim Hochladen einer Datei> 4 MB der folgende Fehler ausgegeben: org.springframework.dao.TransientDataAccessResourceException: PreparedStatementCallback; SQL [Einfügen in test_doc (doc_id, duration_of_doc, doc_version_id, file_name, doc) Werte (?,?,?,?,?)]; Das Paket für die Abfrage ist zu groß (6656781> 4194304). Sie können diesen Wert auf dem Server ändern, indem Sie die Variable max_allowed_packet 'setzen.; verschachtelte Ausnahme ist com.mysql.jdbc.PacketTooBigException: Paket für Abfrage ist zu groß (6656781> 4194304). Sie können diesen Wert auf dem Server ändern, indem Sie die Variable max_allowed_packet 'festlegen.
Also habe ich diesen Befehl von MySQL ausgeführt:
quelle
Wenn der Fehler "Verbindung zurücksetzen" angezeigt wird , liegt das Problem möglicherweise im Attribut maxSwallowSize des Tomcat-Standardconnectors , das aus Tomcat 7.0.55 ( ChangeLog ) hinzugefügt wurde.
Aus der Apache Tomcat 8-Konfigurationsreferenz
Für Springboot Embedded Tomcat deklarieren Sie eine 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; }
Oder in der Tomcat / conf / server.xml für 5 MB
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" maxSwallowSize="5242880" />
quelle
Keine der oben genannten Konfigurationen funktionierte für mich mit einer Spring-Anwendung.
Die Implementierung dieses Codes in der Hauptanwendungsklasse (die mit @SpringBootApplication kommentierte) hat den Trick getan.
@Bean EmbeddedServletContainerCustomizer containerCustomizer() throws Exception { return (ConfigurableEmbeddedServletContainer container) -> { if (container instanceof TomcatEmbeddedServletContainerFactory) { TomcatEmbeddedServletContainerFactory tomcat = (TomcatEmbeddedServletContainerFactory) container; tomcat.addConnectorCustomizers( (connector) -> { connector.setMaxPostSize(10000000);//10MB } ); } }; }
Sie können die akzeptierte Größe in der Anweisung ändern:
quelle
Um diese Ausnahme zu vermeiden, können Sie VM-Argumente verwenden, wie ich sie in Spring 1.5.8.RELEASE verwendet habe:
quelle
Für mich nichts von früheren Arbeiten (vielleicht ist die Verwendung der Anwendung mit Yaml hier ein Problem), aber machen Sie sich mit diesem Problem vertraut:
quelle
Fügen Sie dies in Ihre
application.yml
Datei ein, um das Hochladen von Dateien mit bis zu 900 MB zu ermöglichenquelle