2016-02-14 3 views
0

Сегодня я пытаюсь написать код для загрузки 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 из заголовка ответа?

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

ответ

1

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

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

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

Смежные вопросы