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:
Selbst die globalen@ControllerAdvice
können die obige Ausnahme nicht erfassen!
Geprüft
-
Feder 4.3.5.FREIGABE
-
Tomcat 8
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.