2016-02-14 51 views
0

今天我試着編寫下載zip文件的代碼。但是,我發現了一個棘手的問題?設置Servlet響應內容長度失敗

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連接上,它們首先從服務器發送到客戶端。

一旦服務器開始編寫響應的實體主體,服務器就無法將內容長度信息傳輸到客戶端。

你的兩個例子的區別在於較小的內容仍然適合你的servlet容器的響應實現的緩衝區。所以它可以在任何內容字節之前發送內容長度。應答機構僅在以下呼叫後發送至flushBuffer()

相關問題