InputStream закрыт в Apache FileUpload API - PullRequest
2 голосов
/ 17 сентября 2011

Это очень специфический вопрос. Я надеюсь, что здесь есть кто-то с хорошим знанием API FileUpload.

Если вы работали с этим API, вы должны знать, что, когда максимальный размер файла превышен, следующие элементы не могут быть прочитаны, поскольку выдается исключение FileSizeLimitExceededException и если вы попытаетесь еще раз вызвать метод hasNext() для перехода к следующему элементу выдается IOException, поскольку входной поток закрыт, и вы пытаетесь прочитать его снова.

Этот сценарий очень плох, потому что следующие параметры не могут быть прочитаны. Supose эту форму:

<form action="..." method="post" enctype="multipart/form-data">
    <input type="hidden" name="param1" value="foo"/>
    <input type="file" name="myFile"/><br/>
    <input type="hidden" name="param2" value="bar"/>
    <input type="submit"/>
</form>

Теперь размер файла превышает максимальный. Результат:
"param1" читается.
«myFile» создает исключение FileSizeLimitExceededException.
"param2" не читается.

Я пытаюсь переписать часть API - без везения - потому что я хочу прочитать следующие пункты (в данном случае «param2»).

У кого-нибудь была такая же проблема? Как вы это исправили?

Спасибо.


РЕДАКТИРОВАТЬ: Ну, я реализовал решение, предложенное BalusC. На будущее:
FileUpload оболочка
Использование оболочки FileUpload

Если вы считаете, что этой обертке нужно что-то еще, просто скажите это. Я не принимаю это как реальное решение, потому что идеал - модифицировать и исправить сам API.

1 Ответ

1 голос
/ 17 сентября 2011

Способ без взлома API был бы таким: установите ограничение на размер загружаемого файла равным «unlimited», а затем проверьте размер загружаемого файла самостоятельно FileItem#getSize().Это может занять больше времени, прежде чем конечный пользователь получит обратную связь об этом, потому что весь файл должен быть прочитан полностью в первую очередь (но вам нужно сделать это в любом случае, чтобы получить все последующие элементы).

Как совершенно другойВ качестве альтернативы вы можете взглянуть на новый HTML5 File API , который предлагает вам способ проверить размер файла с помощью JavaScript до фактической отправки запроса.

var size = document.getElementById("fileFieldId").files[0].size;
// ...
...