[英]Can't Download large files in html request
我的問題是,我無法下載大於100mb的文件,並且懷疑html請求
這是我的回應中的setHeader
HttpServletResponse response = (HttpServletResponse) requestContext.getExternalContext().getNativeResponse();
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename=\""+fileName+"\"");
response.setHeader("Pragma", "public");
response.setHeader("Cache-control", "private");
這是讀取文件的流聲明
ServletOutputStream sos = response.getOutputStream();
sos.flush();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String str = br.readLine();
while (str != null) {
sos.write(str.getBytes());
sos.write(13);
sos.write(10);
str = br.readLine();
}
對於小文件,此“ while”工作正常,但對於大文件,此會話似乎丟失了會話,因為我錯過了調試並且不會在下一個斷點處停止。 有什么辦法可以防止執行失誤
每次讀取一些數據后,在while循環中刷新輸出流對象。 您可以設置一個長值並檢查。 如果達到該限制,則可以刷新輸出流對象中的數據,以便系統將刷新大量數據並釋放為此分配的內存,因此不會出現內存不足錯誤。
ServletOutputStream sos = response.getOutputStream();
long byteRead = 0;
try {
byte[] buf = new byte[8291];
while (true) {
int r = is.read(buf);
if (r == -1)
break;
sos.write(buf, 0, r);
byteRead +=r;
if(byteRead > 1024*1024){ //flushes after 1mb
byteRead = 0;
sos.flush();
}
}
} finally {
if(sos != null){
sos.flush();
}
try{is.close();}catch(Exception e){}
try{sos.close();}catch(Exception e){}
}
問題最可能的原因是圖像的字節數據沒有換行符,並且您的內存不足以嘗試讀取一行。 您需要創建一個固定大小的緩沖區並直接復制字節。 像這樣:
ServletOutputStream sos = response.getOutputStream();
sos.flush();
try {
byte[] buf = new byte[1000];
while (true) {
int r = is.read(buf);
if (r == -1)
break;
sos.write(buf, 0, r);
}
} finally {
try{is.close();}catch(Exception e){}
try{sos.close();}catch(Exception e){}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.