2016-08-11 7 views
0

У меня есть странный вопрос:Проблема с проверкой размера InputStream

Мой dropwizard API обрабатывает загруженный файл и сохраняет его в виде изображения JPEG

загруженный файл читается как InputStream.

FormDataBodyPart fileBody считывается с помощью @FormDataParam("file")

InputStream imageStream = fileBody.getValueAs(InputStream.class); 
final int maxSize = 102400; 
final byte[] bytes = new byte[maxSize + 1]; 
int totalBytes = this.imageStream.read(bytes); 
System.out.println("totalBytes:"+totalBytes); 

значение totalBytes возвращается никогда больше 8181 независимо от исходного размера загружаемого файла. Я попытался с 800KB и 1.3MB файлов

HttpServletRequest.getContentLength() показывает правильное количество байт, как закачанный

, что я здесь отсутствует?

+0

Я просто хотел бы отметить, что магическое число '8181' имеет некоторые возможные объяснения:' 8181 * 8 = 65 448 ~ 65 536 = 2^16' -> '16 bits = 2 bytes'. Я могу быть не прав. – ZbyszekKr

ответ

0

InputStream.read (байт [])

не гарантирует читать полное содержание. Из javadoc:

Читает некоторое количество байтов из входного потока и сохраняет их в массив буфера b. Число фактически прочитанных байтов возвращается как целое число. Этот метод блокируется до тех пор, пока не будут доступны входные данные, обнаружен конец файла или не будет выбрано исключение.

Кажется, что только 8181 байт доступно при первом вызове. Вам нужно продолжить чтение до тех пор, пока метод не вернет -1 и не объединит все прочитанные байты.

+0

Нашел полезным: 'INT TotalBytes = ByteStreams.toByteArray (this.imageStream) .length;' с помощью Google гуавы, как ответил здесь: [Преобразование InputStream в массив байтов в Java] (http://stackoverflow.com/ а/23455220/3175357) – Manohar