Столкновение с именем из нескольких частей при загрузке файла Tomcat Servlet 3.0 во временную папку - PullRequest
1 голос
/ 05 апреля 2019

Похоже, что Tomcat не обрабатывает параллельные загрузки одного и того же составного файла двумя разными пользователями.

Тест

  • Две сессии / пользователи A & B
  • Оба загружают файл размером 20 МБ с тем же именем foo.pdf более или менее одновременно
  • Запрос сервлета 3.0 с конфигурацией по умолчанию сохраняет два файла в tmpпапка
  • Оба потока пытаются записать foo.pdf в папку tmp

Результат

  • Загруженный документ поврежден(два потока записывают в него)
  • Более медленный запрос завершится ошибкой с FileNotFoundException, поскольку файл tmp уже был удален задачей очистки более быстрого запроса.

Есть лиспособ избежать этого - кроме установки fileSizeThreshold выше, чем maxFileSize, чтобы он никогда не записывался на диск.

Примечание: это приложение Spring Boot 2.1, но это не имеет значенияпоскольку он использует эту реализацию Servlet 3.0 по умолчанию.

1 Ответ

0 голосов
/ 08 апреля 2019

У меня есть ответ, но он не совсем удовлетворителен. Мы не выяснили, как заставить это работать с реализацией Servlet 3.0 от Tomcat. Однако, как только мы переключились на Apache commons-fileupload, все было хорошо.

Итак, для Spring (Boot) приложений вы бы

  • набор spring.servlet.multipart.enabled: false
  • настроить бин типа CommonsMultipartResolver с именем multipartResolver
  • добавить зависимость commons-fileupload
...