Проблема с загрузкой файла Spring и сбросом подключения
Инициализатор сервлета Spring для настройки лимита загрузки файлов, 5 МБ на файл и 10 МБ на запрос.
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); } }
Если вы попытаетесь загрузить файл размером больше, чем лимит загрузки, пусть говорит 20 МБ, будет отображаться следующая странная ошибка «соединение сбрасывается»:
Даже глобальный@ControllerAdvice
не может поймать вышеуказанное исключение!
проверенный
-
Весна 4.3.5. ВЫПУСК
-
Tomcat 8
1. Решение
После нескольких дней расследования и исследований я обнаружил, что проблема не связана со Spring (без проблем при развертывании на Jetty), это коннектор Tomcat по умолчаниюmaxSwallowSize
Котировка -Apache Tomcat 8 Configuration Reference
Максимальное количество байтов тела запроса (исключая накладные расходы на кодирование передачи), которые будут проглочены Tomcat для прерванной загрузки. Прерванная загрузка - это когда Tomcat знает, что тело запроса будет проигнорировано, но клиент все равно его отправляет. Если Tomcat не проглотит тело, клиент вряд ли увидит ответ. Если не указан, будет использоваться значение по умолчанию 2097152 (2 мегабайта). Значение меньше нуля указывает, что ограничение не должно применяться.
Если вы попытаетесь загрузить файл с размером, превышающим лимит, Tomcat обрежет его до 2 МБ по умолчанию и сбросит соединение. Чтобы решить эту проблему быстро, поставьте -1 (неограниченно) вместоmaxSwallowSize
Tomcat/conf/server.xml
Этот -1 хорош для разработки, но не для производства. Если пользователь попытается загрузить файл размером 100 МБ, Tomcat потратит ресурсы на обработку дополнительной полосы пропускания.
2. Idea
2. 1 Попробуйте установить разумный предел для загрузки файла, например11mb
(11 x 1024 x 1024 = байтов) в этом примере.
Tomcat/conf/server.xml
2.2 And implement a Javascript to check the file size before the upload.
What about Jetty?
Протестировано с Jetty 9, не может найти никаких настроекmaxSwallowSize
, и это НЕ приведет к сбросу соединения, если размер файла превысит лимит загрузки.