2011-09-13 36 views
2

我使用內容配置下載pdf。當我點擊下載按鈕時,首先下載完整的pdf文件,然後瀏覽器顯示對話框以保存文件。我希望瀏覽器顯示下載過程。以下是我的servlet代碼:下載過程在servlet下載時不可見pdf

 String filename = "abc.pdf"; 
     String filepath = "/pdf/" + filename; 
     resp.setContentType("application/pdf"); 
     resp.addHeader("content-disposition", "attachment; filename=" + filename); 

     ServletContext ctx = getServletContext(); 
     InputStream is = ctx.getResourceAsStream(filepath); 

     System.out.println(is.toString()); 
     int read = 0; 

     byte[] bytes = new byte[1024]; 

     OutputStream os = resp.getOutputStream();   
     while ((read = is.read(bytes)) != -1) { 
      os.write(bytes, 0, read); 
     } 
     System.out.println(read); 

     os.flush(); 
     os.close(); 
     }catch(Exception ex){ 
      logger.error("Exception occurred while downloading pdf -- "+ex.getMessage()); 
      System.out.println(ex.getStackTrace()); 
     } 

回答

3

進度不能事先不知道在客戶端側的響應人體的內容長度被確定。爲了讓客戶知道內容長度,您需要在服務器端設置Content-Length標題。

InputStream is = ctx.getResourceAsStream(filepath); 

更改爲

URL resource = ctx.getResource(filepath); 
URLConnection connection = resource.openConnection(); 
response.setContentLength(connection.getContentLength()); // <--- 
InputStream is = connection.getInputStream(); 
// ... 

無關到具體的問題,你的異常處理是壞的。通過

throw new ServletException(ex); 
替換行

System.out.println(ex.getStackTrace());