簡體   English   中英

無法下載HTML請求中的大文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM