Настройка Apache Tomcat Максимальный размер загружаемого файла

Настройка Apache Tomcat Максимальный размер загружаемого файла

Я реализую веб-приложение Grails/Groovy, я хочу ограничить размер загружаемого пользователем файла, я не хочу, чтобы кто-то загружал файл размером 10 ГБ на мой сервер. Я выяснил, что большинство подходов к расчету размера выполняется после того, как файл уже загружен, что, если кто-то выложит 10 профилей и загрузит 10 файлов размером до 10 ГБ? Это может истощить сервер и занять слишком много места на диске сервера. Поэтому я пытаюсь предотвратить это.

Я выяснил, что Apache Tomcat допускает следующую конфигурацию, в жестко закодированном или аннотированном подходе. Я не уверен, вычисляется ли max-file-size во время процесса загрузки или после загрузки файла во временное место. В документации указано следующее:

Аннотация @MultipartConfig поддерживает следующие необязательные атрибуты:

location: Абсолютный путь к каталогу в файловой системе. Атрибут location не поддерживает путь относительно контекста приложения. Это местоположение используется для временного хранения файлов, пока обрабатываются детали или когда размер файла превышает указанный параметр fileSizeThreshold. Местоположение по умолчанию — "".

fileSizeThreshold: Размер файла в байтах, после которого файл будет временно сохранен на диске. Размер по умолчанию — 0 байт.

MaxFileSize: Максимально допустимый размер загружаемых файлов в байтах. Если размер любого загружаемого файла превышает этот размер, веб-контейнер выдаст исключение (IllegalStateException). Размер по умолчанию не ограничен.

maxRequestSize: Максимально допустимый размер для multipart/form-data запроса в байтах. Веб-контейнер выдаст исключение, если общий размер всех загруженных файлов превысит этот порог. Размер по умолчанию не ограничен.

подход к аннотации:

@MultipartConfig(location="/tmp", fileSizeThreshold=1024*1024, 
    maxFileSize=1024*1024*5, maxRequestSize=1024*1024*5*5)

а вот жестко закодированное значение:

<multipart-config>
<!– 50MB max –>
<max-file-size>52428800</max-file-size>
<max-request-size>52428800</max-request-size>
<file-size-threshold>0</file-size-threshold>
</multipart-config>

Буду признателен, если кто-нибудь сможет пояснить, рассчитывается ли MaxFileSize в процессе загрузки.

решение1

MaxFileSize будет рассчитан после того, как весь файл уже загружен. Вы можете загрузить файл (размером 1 ГБ) в свое веб-приложение, и тогда вы увидите, что на самом деле произойдет. Поэтому полагаться на Tomcat не имеет смысла. Выполнение той же работы в Servlet возможно, но когда ваш счетчик достигает MaxFileSize, как вы можете отключить базовое HTTP-соединение? Я думаю, у вас нет возможности. Протокол HTTP является однонаправленным, поэтому вы также не можете сообщить браузеру, чтобы он отменил длинный пост вовремя. Единственное, что вы можете сделать, это когда ваш счетчик достигает порогового значения, просто игнорировать последующие байты из входного потока, чтобы защитить дисковое пространство до завершения передачи файла.

Связанный контент