Fehler beim Hochladen von Dateien und Zurücksetzen der Verbindung

Problem beim Hochladen der Spring-Datei und beim Zurücksetzen der Verbindung

Ein Spring-Servlet-Initialisierer zum Konfigurieren des Upload-Limits für Dateien, 5 MB pro Datei und 10 MB pro Anforderung.

MyWebInitializer.java

public class MyWebInitializer extends
        AbstractAnnotationConfigDispatcherServletInitializer {

    private int maxUploadSizeInMb = 5 * 1024 * 1024; // 5 MB

    //...

    @Override
    protected void customizeRegistration(ServletRegistration.Dynamic registration) {

        // upload temp file will put here
        File uploadDirectory = new File(System.getProperty("java.io.tmpdir"));

        // register a MultipartConfigElement
        MultipartConfigElement multipartConfigElement =
                new MultipartConfigElement(uploadDirectory.getAbsolutePath(),
                        maxUploadSizeInMb, maxUploadSizeInMb * 2, maxUploadSizeInMb / 2);

        registration.setMultipartConfig(multipartConfigElement);

    }

}

Wenn Sie versuchen, eine Datei hochzuladen, die größer als das Upload-Limit ist, sagen wir 20 MB, wird der folgende seltsame Fehler beim Zurücksetzen der Verbindung angezeigt:

spring-file-upload-connection-reset

Selbst die globalen@ControllerAdvicekönnen die obige Ausnahme nicht erfassen!

Geprüft

  1. Feder 4.3.5.FREIGABE

  2. Tomcat 8

  3. Beispiel für das Hochladen von MVC-Dateien

1. Lösung

Nach einigen Tagen der Untersuchung und Recherche stelle ich fest, dass das Problem nicht mit Spring zusammenhängt (kein Problem, wenn es auf Jetty bereitgestellt wird), sondern mit dem Tomcat-StandardconnectormaxSwallowSize

Die maximale Anzahl von Anforderungshauptteil-Bytes (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.

Wenn Sie versuchen, eine Dateigröße hochzuladen, die die Größenbeschränkung überschritten hat, schneidet Tomcat sie auf die Standardgröße von 2 MB zu und setzt die Verbindung zurück. Um es schnell zu lösen, setzen Sie -1 (unbegrenzt) fürmaxSwallowSize

Tomcat/conf/server.xml

    

Diese -1 ist gut für die Entwicklung, aber nicht für die Produktion. Wenn der Benutzer versucht, eine 100-MB-Datei hochzuladen, verschwendet Tomcat Ressourcen, um die zusätzliche Bandbreite zu bewältigen.

2. Idea

2. 1 Versuchen Sie, in diesem Beispiel eine angemessene Grenze für das Hochladen von Dateien festzulegen, z. B.11mb (11 x 1024 x 1024 = Byte)

Tomcat/conf/server.xml

    

2.2 And implement a Javascript to check the file size before the upload.

What about Jetty?
Getestet mit Jetty 9, kann keinemaxSwallowSize-Einstellung herausfinden und führt NICHT zu einem Zurücksetzen der Verbindung, wenn die Dateigröße das Upload-Limit überschritten hat.