Я реализую веб-приложение Grails / Groovy, я хочу ограничить размер загружаемого пользователем файла, я не хочу, чтобы кто-то загружал файл размером 10 ГБ на мой сервер. Я понял, что большинство подходов к вычислению размера выполняется после того, как файл уже загружен, что, если кто-то создаст 10 профилей и загрузит 10 файлов размером до 10 ГБ? Это может истощить сервер и занять так много места на диске сервера. Поэтому я пытаюсь предотвратить это.
Я выяснил, что Apache Tomcat допускает следующую конфигурацию: жестко запрограммированный подход или подход с использованием аннотаций. Я не уверен, рассчитывается ли максимальный размер файла во время процесса загрузки или после того, как файл загружен во временное место. В документации указано следующее:
Аннотация @MultipartConfig поддерживает следующие необязательные атрибуты:
расположение: абсолютный путь к каталогу в файловой системе. Атрибут местоположения не поддерживает путь относительно контекста приложения. Это расположение используется для временного хранения файлов во время обработки частей или когда размер файла превышает указанный параметр 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 в процессе загрузки.
MaxFileSize будет рассчитан после того, как весь файл будет уже загружен. Вы можете загрузить файл (размером 1 ГБ) в свое веб-приложение, и тогда вы заметите, что происходит на самом деле. Так что полагаться на Tomcat не имело смысла. Выполнение той же работы в сервлете возможно, но когда ваш счетчик достигает MaxFileSize, как вы можете отключить базовое HTTP-соединение? Я думаю, у тебя нет выхода. Протокол HTTP является однонаправленным, поэтому вы также не можете указать браузеру вовремя отменить длинную публикацию. Единственное, что вы можете сделать, это когда ваш счетчик достигнет порога, просто игнорируйте последующие байты из входного потока, чтобы защитить дисковое пространство до завершения передачи файла.