2012-10-29 119 views
1

我有一個簡單的JSP頁面,其中包含2個按鈕:查看和導出。當單擊查看按鈕時,我將從數據庫中獲取數據,將副本保存到會話中,並將HTML代碼寫入包含數據的標籤中。稍後,當用戶單擊導出時,我想在服務器中生成一個excel文件(使用會話中的數據)並將其下載到客戶端。使用AJAX下載JSP文件

Excel文件在服務器端成功創建。我正在使用客戶端的AJAX請求從服務器下載Excel文件。

JSP代碼:

try{       

        String filepath=ExportToExcel(session.getAttribute("InvestmentDetails")); 

        //Setting file to download 
        response.setContentType("application/x-download"); 

        response.setHeader("Content-Disposition","attachment; filename=\"SIPInvestment_531.xls\"");                    
        response.setStatus(200); 
        InputStream in = null; 
        ServletOutputStream outs = response.getOutputStream();       

        try {        
         File filetodownload=new File(filepath); 
         response.setContentLength(Integer.parseInt(String.valueOf(filetodownload.length())));         
         in = new BufferedInputStream(new FileInputStream(filetodownload));        
         int ch; 
         while ((ch = in.read()) != -1) { 
          outs.print((char) ch); 
         } 
        } 
        finally { 
         if (in != null) in.close(); 
        } 
        outs.flush(); 
        outs.close();             

       } 
       catch(Exception ex){ 
        str=ex.getMessage();           
       } 

這裏是JavaScript:

xmlhttp=new XMLHttpRequest(); 
      xmlhttp.onreadystatechange=function(){ 
       if (xmlhttp.readyState==4 && xmlhttp.status==200) 
        { 


        } 
      } 
      xmlhttp.open("POST","/SIP/rptClientInvestmentDetails.jsp?requesttype=export",false); 
      xmlhttp.send();       

的請求到達JSP頁面上。沒有任何異常,它寫入響應輸出流。但是沒有下載從瀏覽器彈出。可能是什麼問題?

+0

你不會得到一個異常,說明你」是否已經開始寫入響應,因爲您嘗試再次寫入嵌入在JSP中的不適當Java代碼中的響應? –

回答

2

Ajax應該用於元語言,而不是用於二進制文件。

簡單

<a href="/SIP/rptClientInvestmentDetails.jsp?requesttype=export" 
    target="_blank">Export</a> 

是你所需要的。

如果你確定你說的是response.setHeader("Content-Disposition","attachment,你應該刪除BalusC建議的目標屬性。

+1

請注意,此處不需要「target」屬性。它甚至可能令人不安,因爲它使最終用戶留下一個完全空白的選項卡,因爲這種類型的下載內容類型強制*另存爲*對話框。 – BalusC

+0

這就是它!感謝Peter ..但是爲什麼Ajax不能用於二進制文件? – Vivek

+1

JavaScript由於明顯的安全原因,沒有設施強制使用獨立檢索/生成內容的*另存爲*對話框。 – BalusC

0

我認爲你可以使用location.href =「提供的Java類函數名」。這將控制從JSP中的Java功能,傳輸,而無需使用Ajax調用

+0

請列出這種效果所需的框架。 –