it-swarm.com.de

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

Ich entwickle eine Anwendung, die auf Spring Boot und AngularJS basiert, mit JHipster . Meine Frage ist, wie man max-Größe der Upload-Dateien einstellt.

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 kann ich das einstellen?

38
Michał Styś

In Spring Boot 1.4 können Sie Ihrer application.properties außerdem folgende Zeilen hinzufügen, um die Dateigrößenbegrenzung festzulegen:

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

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

UPDATE:

Jemand fragte die Unterschiede zwischen den beiden Eigenschaften.

Hier sind die formalen Definitionen:

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

MaxRequestSize: Die maximal zulässige Größe für eine Anforderung für mehrteilige Formulardaten 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 die Einzeldatei.

MaxRequestSize: Das Limit für die Gesamtgröße aller Dateien in einer einzigen Uploadanforderung. Dies überprüft das Gesamtlimit. Angenommen, Sie haben zwei Dateien a.txt und b.txt für eine einzige Upload-Anforderung. a.txt ist 5kb und b.txt ist 7kb, so dass MaxRequestSize über 12kb liegen sollte.

54

Sie müssen die Parameter multipart.maxFileSize und multipart.maxRequestSize auf höhere Werte als den Standardwert setzen. Dies kann in den Spring-Boot-Konfigurations-Yml-Dateien erfolgen. Wenn Sie beispielsweise application.yml Folgendes hinzufügen, können Benutzer 10-MB-Dateien hochladen:

multipart:
    maxFileSize: 10Mb
    maxRequestSize: 10Mb

Wenn der Benutzer mehrere Dateien in einer einzelnen Anforderung hochladen kann und insgesamt mehr als 10 MB beträgt, müssen Sie multipart.maxRequestSize auf einen höheren Wert konfigurieren:

multipart:
    maxFileSize: 10Mb
    maxRequestSize: 100Mb

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

17
geraldhumphries

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

14
denzal

In Spring Boot 2 wurde der spring.http.multipart in spring.servlet.multipart geändert.

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

13
Allar Saarnak

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

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

Wenn Sie Tomcat verwenden müssen, können Sie am Ende EmbeddedServletContainerCustomizer erstellen.

Wenn Sie ohne Tomate leben können, können Sie ersetzen Sie Tomcat durch beispielsweise Untertitel und vermeiden Sie dieses Problem. 

9

Im spring 2.x. Die Optionen haben sich geringfügig geändert. Die obigen Antworten sind also fast richtig, aber nicht vollständig. In deinem application.properties Datei, fügen Sie Folgendes hinzu:

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

Fügen Sie in Ihrer application.yml-Konfigurationsdatei Folgendes zum Abschnitt "spring:" hinzu.

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

Whitespace ist wichtig und Sie können keine Registerkarten zum Einrücken verwenden .

5
MobileMateo

Ich fand die Lösung bei Expert Exchange, die für mich gut funktionierte.

@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

Diese Eigenschaften in Spring Boot application.properties machen die zulässige Dateigröße unbegrenzt -

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

Ich weiß, das ist extrem spät im Spiel, aber ich wollte das zusätzliche Problem veröffentlichen, mit dem ich bei der Verwendung von Mysql konfrontiert war, falls in Zukunft jemand das gleiche Problem hat.

Wie bei einigen der oben genannten Antworten wird das Problem hauptsächlich durch das Festlegen dieser Einstellungen in application.properties behoben

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 Datei "application.properties" ergab der Fehler beim Hochladen einer Datei> 4MB: Org.springframework.dao.TransientDataAccessResourceException: PreparedStatementCallback; SQL [in test_doc einfügen (doc_id, duration_of_doc, doc_version_id, Dateiname, doc) Werte (?,?,?,?,?)]; Das Abfragepaket ist zu groß (6656781> 4194304). Sie können diesen Wert auf dem Server ändern, indem Sie die Variable max_allowed_packet festlegen .; Die verschachtelte Ausnahme ist com.mysql.jdbc.PacketTooBigException: 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 festlegen.

Also habe ich diesen Befehl von mysql ausgeführt:

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

Ich verwende spring-boot-1.3.5.RELEASE und hatte das gleiche Problem. Keine der oben genannten Lösungen funktioniert für mich nicht. Durch das Hinzufügen der folgenden Eigenschaft zu application.properties wurde das Problem behoben.

multipart.max-file-size=10MB
2

Wenn Sie den Fehler "Verbindung zurücksetzen" erhalten, könnte das Problem im Tomcat-Standardconnector maxSwallowSize-Attribut liegen, das aus Tomcat 7.0.55 hinzugefügt wurde ( ChangeLog ).

Von Apache Tomcat 8 Konfigurationsreferenz

maxSwallowSize: Die maximale Anzahl von Request-Body-Bytes (außer Übertragungscodierung Overhead), die von Tomcat für einen abgebrochenen Upload verschluckt werden. Ein Abgebrochener Upload ist, wenn Tomcat weiß, dass der Anforderungstext an .__ geht. ignoriert werden, aber der Client sendet es immer noch. Wenn Tomcat nicht schluckt Der Körper wird dem Kunden wahrscheinlich nicht die Antwort sehen. Wenn nicht angegeben. Der Standardwert von 2097152 (2 MB) wird verwendet. Ein Wert von weniger als null bedeutet, dass kein Limit durchgesetzt werden sollte.

Für Springboot Embedded Tomcat muss eine TomcatEmbeddedServletContainerFactory deklariert werden 

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

Für mich gibt es nichts von früheren Arbeiten (vielleicht ist die Verwendung von yaml hier ein Problem), aber ich werde dieses Problem damit lösen:

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

Keine der oben genannten Konfigurationen funktionierte für mich mit einer Spring-Anwendung.

Die Implementierung dieses Codes in der main application -Klasse (der mit @SpringBootApplication kommentierte) war der Trick.

@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

0
Tomer Shay

Um diese Ausnahme zu vermeiden, können Sie die Argumente von VM wie in Spring 1.5.8.RELEASE verwenden:

-Dspring.http.multipart.maxFileSize=70Mb
-Dspring.http.multipart.maxRequestSize=70Mb
0
Khushboo Sharma

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

0
Gank