Рубрики
Без рубрики

Проблема с загрузкой файлов весной и сбросом подключения

– Весенняя загрузка файлов и сброс подключения вопрос

Инициализатор сервлета Spring для настройки ограничения загрузки файлов, 5 Мб на файл и 10 Мб на запрос.

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 не может поймать вышеупомянутое исключение!

Проверенный

  1. Пружина 4.3.5. ВЫПУСК
  2. Кот 8
  3. Пример загрузки файла Spring MVC

1. Решение

После нескольких дней исследований и исследований я выяснил, что проблема не была связана с Spring (нет проблем, если она развернута на причале), это соединитель Tomcat по умолчанию maxSwallowSize

Цитата – Справочник по конфигурации Apache Tomcat 8

Максимальное количество байтов тела запроса (без учета накладных расходов на кодирование передачи), которое будет поглощено Tomcat для прерванной загрузки. Прерванная загрузка – это когда Tomcat знает, что тело запроса будет проигнорировано, но клиент все равно отправляет его. Если кот не проглотит тело, клиент вряд ли увидит ответ. Если не указано, будет использоваться значение по умолчанию 2097152 (2 мегабайта). Значение меньше нуля указывает на то, что ограничение не должно применяться.

Если вы попытаетесь загрузить файл размером, превышающим предельный размер, Tomcat обрезает его на 2 Мб по умолчанию и сбросит соединение. Чтобы решить ее быстро, поставьте -1 (неограниченно) для maxSwallowSize

    

Это -1 хорошо для разработки, но не для производства, если пользователь попытается загрузить файл размером 100 Мб, Tomcat будет тратить ресурсы на обработку дополнительной пропускной способности.

2. Идея

2. 1 Попробуйте установить разумный предел для загрузки файла, например, 11 мб (11 x 1024 x) в этом примере

    

2.2 И реализуйте Javascript для проверки размера файла перед загрузкой.

Рекомендации

  1. Справочник по конфигурации Apache Tomcat 8
  2. Настройка свойства tomcat с помощью свойств приложения spring boot
  3. Пример загрузки файла Spring MVC

Оригинал: “https://mkyong.com/spring/spring-file-upload-and-connection-reset-issue/”