Ошибка установки длины содержимого ответа сервлета

Сегодня я пытаюсь написать код для загрузки zip файла. Однако я обнаружил сложную проблему?

HttpServletResponse response

...

response.setContentType("application/zip");
response.setHeader("Content-Disposition", String.format("attachment; filename=myzipfile-" + new Date().getTime() + ".zip"));

File file = new File(somePath);
InputStream inputStream = new FileInputStream(file);
IOUtils.copy(inputStream, response.getOutputStream());
inputStream.close();

response.setContentLengthLong(file.length());
response.flushBuffer();

Затем я пытаюсь загрузить два файла, размер первого - 232, я могу загрузить его с Content-Length: 232 в заголовке.

Однако, когда я загружаю более крупный, размер которого составляет 8 392 236 байт, я также могу его загрузить. Но мне не удалось получить Content-Length из заголовка ответа?

Как можно понять, в чем проблема? Есть ли ограничение на длину содержания в заголовке ответа?


person Janewzh    schedule 14.02.2016    source источник


Ответы (1)


Информация Content-Length является частью полей заголовка HTTP-ответа. По TCP-соединению они сначала отправляются от сервера к клиенту.

После того, как сервер начал записывать тело объекта ответа, в протоколе HTTP сервер не может передать информацию о длине содержимого клиенту.

Разница между вашими двумя примерами заключается в том, что меньшее содержимое по-прежнему помещается в буфер реализации ответа вашего контейнера сервлета. Таким образом, он может отправлять длину содержимого перед любым байтом содержимого. Тело ответа отправляется только при следующем вызове flushBuffer()

person mkoeller    schedule 16.02.2016