Определите размер загружаемого файла перед чтением всего этого в API потоковой передачи Apache FileUpload

Существует два способа использования библиотеки Apache FileUpload.

Файл загружен

http://commons.apache.org/fileupload/using.html

И Потоковый API FileUpload

http://commons.apache.org/fileupload/streaming.html

Они оба прекрасно работают, за исключением того, что потоковый API, похоже, не имеет возможности проверить fileSize перед обработкой потока.

Это потому, что Streaming API принципиально не знает размер файла или потому что мне нужно вручную прочитать некоторые заголовки или что-то, чтобы получить размер загрузки Multipart?

1 ответ

Невозможно узнать размер части составного запроса без использования всего тела HTTP-запроса. И как только началось потребление тела HTTP-запроса, вы не можете прекратить использовать его на полпути. Он должен использоваться до последнего байта, прежде чем ответ может быть возвращен. Это просто природа HTTP и TCP/IP. Чтобы сохранить низкое использование памяти сервера, вы можете просто отбросить считанные байты, когда они превышают размер (т.е. проверить это внутри цикла чтения и не назначать их какой-либо переменной).

Лучше всего проверить правильность длины файла в JavaScript перед загрузкой. Это поддерживается в браузерах, поддерживающих HTML5 File API. Текущие версии Firefox, Chrome, Safari, Opera и Android поддерживают его. IE9 пока не поддерживает его, это будет в будущем IE10.

<input type="file" ... onchange="checkFileSize(this)" />

Где checkFileSize() выглядеть примерно так

function checkFileSize(inputFile) {
    var max = 10 * 1024 * 1024; // 10MB

    if (inputFile.files && inputFile.files[0].size > max) {
        alert("File too large."); // Do your thing to handle the error.
        inputFile.value = null; // Clear the field.
    }
}
Другие вопросы по тегам