ВРЕМЕННО РЕШЕНО: InputStream закрыт в Apache FileUpload API
Я хочу прочитать содержимое заголовка content-disposition, но request.getHeader ("content-disposition")
всегда возвращает null, а request.getHeader ("content-type")
возвращает только первую строку, например multipart/form-data; boundary=AaB03x
.
Предположим, я получаю следующий заголовок:
Content-Type: multipart/form-data; boundary=AaB03x
--AaB03x
Content-Disposition: form-data; name="submit-name"
Larry
--AaB03x
Content-Disposition: form-data; name="files"; filename="file1.txt"
Content-Type: text/plain
... contents of file1.txt ...
--AaB03x--
Я хочу прочитать все заголовки содержимого. Как?
Спасибо.
EDIT1: я действительно хочу решить проблему, когда клиент отправляет файл, размер которого превышает максимальный размер, потому что при вызове request.getPart ("что-то") не имеет значения, какое имя части вы перейдите к нему, потому что он всегда будет вызывать исключение IllegalStateException, даже если запрос не содержит этого имени параметра.
Пример:
Part part = request.getPart ("param");
String value = getValue (part);
if (value.equals ("1")){
doSomethingWithFile1 (request.getPart ("file1"))
}else if (value.equals (2)){
doSomethingWithFile2 (request.getPart ("file2"))
}
private String getValue (Part part) throws IOException{
if (part == null) return null;
BufferedReader in = null;
try{
in = new BufferedReader (new InputStreamReader (part.getInputStream (), request.getCharacterEncoding ()));
}catch (UnsupportedEncodingException e){}
StringBuilder value = new StringBuilder ();
char[] buffer = new char[1024];
for (int bytesRead; (bytesRead = in.read (buffer)) != -1;) {
value.append (buffer, 0, bytesRead);
}
return value.toString ();
}
Я не могу этого сделать, потому что если клиент отправит файл, размер которого превышает максимальный, первый вызов getPart вызовет исключение (см. getPart() Javadoc), поэтому я не знаю, какой файл я получил.
Вот почему я хочу прочитать заголовки содержимого. Я хочу прочитать параметр «param», чтобы узнать, какой файл вызвал исключение.
EDIT2: Ну, с API, который публикует спецификацию Servlet 3.0, вы не можете контролировать предыдущий случай, потому что, если файл вызывает исключение, вы не можете прочитать имя поля файла. Это отрицательная сторона использования оболочки, потому что многие функции исчезают... Также с помощью FileUpload вы можете динамически устанавливать аннотацию MultipartConfig.
Если файл превышает максимальный размер файла, API выдает Исключение FileSizeLimitExceededException. Исключение предоставляет 2 метода для получения имени поля и имени файла.
Но!! моя проблема все еще не решена, потому что я хочу прочитать значение другого параметра, отправленного вместе с файлом в той же форме. (значение "param" в предыдущем пример)
EDIT3: я работаю над этим. Как только я напишу код, я опубликую его здесь!