So legen Sie die maximale Größe der Upload-Datei fest

78

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?

Michał Styś
quelle

Antworten:

122

Auch in Spring Boot 1.4 können Sie Ihrer application.properties folgende Zeilen hinzufügen, um die Dateigrößenbeschränkung festzulegen:

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

für Spring Boot 2.x und höher

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

Hat für mich gearbeitet. Quelle: https://spring.io/guides/gs/uploading-files/

AKTUALISIEREN:

Jemand fragte nach den Unterschieden zwischen den beiden Eigenschaften.

Nachfolgend sind die formalen Definitionen aufgeführt:

MaxFileSize: Die maximal zulässige Größe für hochgeladene Dateien in Byte. Wenn die Größe einer hochgeladenen Datei größer als diese Größe ist, löst der Webcontainer eine Ausnahme aus (IllegalStateException). Die Standardgröße ist unbegrenzt.

MaxRequestSize: Die maximal zulässige Größe für eine mehrteilige / Formulardatenanforderung in Byte. Der Webcontainer löst eine Ausnahme aus, wenn die Gesamtgröße aller hochgeladenen Dateien diesen Schwellenwert überschreitet. Die Standardgröße ist unbegrenzt.

Um jedes zu erklären:

MaxFileSize: Das Limit für das Hochladen einer einzelnen Datei . Dies gilt nur für das Limit für einzelne Dateien.

MaxRequestSize: Das Limit für die Gesamtgröße aller Dateien in einer einzelnen Upload-Anforderung . Dies überprüft das Gesamtlimit. Angenommen , Sie haben zwei Dateien a.txt und b.txt für eine einzelne Upload-Anforderung. a.txt ist 5kb und b.txt ist 7kb, daher MaxRequestSizesollte der Wert über 12kb liegen .

Bahadir Tasdemir
quelle
9
Ich habe die folgenden im Frühjahr Boot 2.0.1 spring.servlet.multipart.max-file-size = 5MB spring.servlet.multipart.max-request-size = 5MB
Nagaraja JB
1
Was ist der Unterschied zwischen max-file-sizeund max-request-size?
Arun Gowda
3
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.
Bahadir Tasdemir
1
Wenn Sie Spring Boot für die Entwicklung von Microservices verwenden, müssen Sie dem Gateway-Service dieselbe Konfiguration hinzufügen, um Upload-Fehler zu vermeiden. Ich hoffe, es erspart jemandem die Probleme, die ich
durchgemacht habe
Wie @AguThadeus für die Microservice-Entwicklung mit einem Gateway-Setup vorgeschlagen hat, müssen wir auch die spring.servlet.multipart.max-file-size = 5MB spring.servlet.multipart.max-request-size = 5MBEigenschaften des Gateways hinzufügen
Sandeep K Nair
23

Stellen Sie für Spring Boot 2. + sicher, dass Sie spring.servletanstelle von verwenden spring.http.

---
spring:
  servlet:
    multipart:
      max-file-size: 10MB
      max-request-size: 10MB

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.

Ondrej Kvasnovsky
quelle
Die Änderung von spring.servlet wurde in spring boot 2+ eingeführt. Es lohnt sich, Ihre Antwort so zu bearbeiten, wie sie zuvor war (spring boot <= 1.5.9). spring.http.multipart
bluelabel
oder: spring.servlet.multipart.max-file-size=10MB spring.servlet.multipart.max-request-size=10MB
SWiggels
Übereinstimmende #SWiggels. Verwenden von spring.servlet ... für diejenigen, die Version> 1.5.9 ausführen.
Gian
21

Sie müssen die Parameter multipart.maxFileSizeund multipart.maxRequestSizeauf 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.ymlkönnen Benutzer 10-MB-Dateien hochladen:

multipart:
    maxFileSize: 10Mb
    maxRequestSize: 10Mb

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.maxRequestSizeeinen höheren Wert konfigurieren :

multipart:
    maxFileSize: 10Mb
    maxRequestSize: 100Mb

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

geraldhumphries
quelle
3
Ich habe folgendes hinzugefügt: http: multipart: maxFileSize: 100Mb maxRequestSize: 100Mb zum Federabschnitt, aber es hat nicht geholfen.
Tibi
2
@tibi Wenn Sie Sprint Boot 1.4.x verwenden, überprüfen Sie die Antwort des Webmasters, da sich diese Eigenschaft geändert hat.
AndreLDM
15

Es gibt einige Unterschiede, wenn wir die Eigenschaften in application.properties und application yaml definieren.

In application.yml:

spring:
    http:
      multipart:
       max-file-size: 256KB
       max-request-size: 256KB

Und in application.propeties:

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

Hinweis: Spring Version 4.3 und Spring Boot 1.4

denzal
quelle
11

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 Ihrer application.propertiesDatei Folgendes hinzu:

spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
sapy
quelle
6

Fügen Sie in Ihrer application.ymlKonfigurationsdatei im Abschnitt "spring:" Folgendes hinzu.

http:
    multipart:
        max-file-size: 512MB
        max-request-size: 512MB

Leerzeichen sind wichtig und Sie können keine Tabulatoren zum Einrücken verwenden .

MobileMateo
quelle
Wenn dies eine Eigenschaft ist, die sowohl in dev als auch in prod festgelegt werden muss, application.ymlwird sie durch einfaches Hinzufügen zu beiden Profilen kaskadiert, sodass Sie sie nicht zweimal festlegen müssen.
Geraldhumphries
5

Diese Eigenschaften in Spring Boot Application.properties machen die akzeptable Dateigröße unbegrenzt -

# To prevent maximum upload size limit exception
spring.servlet.multipart.max-file-size=-1
spring.servlet.multipart.max-request-size=-1
thedevd
quelle
4

Ich benutze spring-boot-1.3.5.RELEASEund ich hatte das gleiche Problem. Keine der oben genannten Lösungen funktioniert bei mir nicht. Aber schließlich application.propertieswurde das Problem behoben, indem folgende Eigenschaft hinzugefügt wurde.

multipart.max-file-size=10MB
Chathura Buddhika
quelle
2
Arbeitete auch für Spring Boot v1.2.3.RELEASE
DjAlan
2

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

spring.http.multipart.max-file-size=16MB
spring.http.multipart.max-request-size=16MB

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:

SET GLOBAL max_allowed_packet = 1024*1024*16;
she12
quelle
2

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

maxSwallowSize : Die maximale Anzahl von Anforderungshauptbytes (ohne Overhead für die Übertragungscodierung), die von Tomcat für einen abgebrochenen Upload verschluckt werden. Ein abgebrochener Upload erfolgt, wenn Tomcat weiß, dass der Anforderungshauptteil ignoriert wird, der Client ihn jedoch weiterhin sendet. Wenn Tomcat den Körper nicht verschluckt, ist es unwahrscheinlich, dass der Kunde die Antwort sieht. Wenn nicht angegeben, wird der Standardwert von 2097152 (2 Megabyte) verwendet. Ein Wert von weniger als Null gibt an, dass kein Limit erzwungen werden sollte.

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" />
Alex
quelle
0

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:

connector.setMaxPostSize (10000000); // 10 MB

Tomer Shay
quelle
0

Um diese Ausnahme zu vermeiden, können Sie VM-Argumente verwenden, wie ich sie in Spring 1.5.8.RELEASE verwendet habe:

-Dspring.http.multipart.maxFileSize=70Mb
-Dspring.http.multipart.maxRequestSize=70Mb
Khushboo Sharma
quelle
VM Argumente können die in application.yml
Khushboo Sharma
0

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:

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

Fügen Sie dies in Ihre application.ymlDatei ein, um das Hochladen von Dateien mit bis zu 900 MB zu ermöglichen

server:
  servlet:
    multipart:
      enabled: true
      max-file-size: 900000000  #900M
      max-request-size: 900000000
Gank
quelle