2011-03-07 48 views
1

我需要打開誰點擊下載按鈕,用戶的PDF文件。輸出PDF文件的內容,而無需創建文件

的下載按鈕可以使一個Ajax調用一個servlet從BLOB字段包含PDF內容的數據庫獲取數據,並返回作爲響應。

我能以使反應做要下載一個PDF文件給用戶。

servlet代碼是如下:

   response.setContentType("application/pdf"); 
       oracle.sql.BLOB blob = (BLOB) rs.getBlob("MYPDF"); 
       byte[] bytes = blob.getBytes(1, (int) blob.length()); 
       ServletOutputStream servletOutputStream = response.getOutputStream(); 
       servletOutputStream.write(bytes, 0, bytes.length); 
       servletOutputStream.flush(); 
       servletOutputStream.close(); 

我接收包含如下所示的在AJAX當我檢查火的錯誤的響應字符的長的響應。

你好嗎? MP){h̕SNJ_A'2kjяR> WBE | = WP%wqǦ>〜 1O㾙9JB; aNx3`zطCOI $; N |; Xۇ; - CFMC( fM6K

我不想提交頁面或者彈出一個窗口,爲在URL中的查詢顯示發送的參數在servlet

我也不想在服務器上創建文件。

有沒有辦法採取的servlet的響應在Ajax調用來了,它顯示到頁面或iFrame和瀏覽器自動下載文件...

回答

2

它是無法下載使用Ajax的文件。但是,使用隱藏的IFRAME可以實現相同的「效果」。不使用XMLHttpRequest,而是動態地創建一個隱藏的iframe,並使用適當的參數將其提交給servlet。當響應到來時,瀏覽器將根據內容類型/擴展名自動處理內容。如果您使用jQuery,則this plugin具有內置的此功能。

+0

'document.getElementById('myform_1')。target ='content_frame';並提交表單'做了伎倆....根據http規範, –

0

聽起來Rahulmohan知道他的東西,但它可能是值得嘗試的文件名頭添加到您的響應流。我在asp.net相似,但不是在Ajax環境和我的代碼和你之間的唯一區別是什麼這一行:

Response.AddHeader(「內容處置」,「附件;文件名=」 & &名「.PDF」)

我的頁面不會在Ajax環境中運行,但。

+0

,瀏覽器應該處理完全基於響應內容類型的響應。但是,與其他任何規格一樣,它們沒有遵循這封信。例如,IE根據文件擴展名處理內容,而不是內容類型。在各種瀏覽器上進行了幾次試驗和錯誤之後,發現使用兩個文件名都帶有正確的擴展名和正確的內容類型是最好的選擇。但是,正如我前面所說的,必須使用iframe。 – rahulmohan

+0

我不懷疑你是正確的Rahulmohan,但我不確定我是否按照你的建議,我可能需要在將來某個時候自己做這件事,所以我想確保我跟着你。你是否創建了一個隱藏的iFrame,它託管着將輸出寫入響應流的頁面,然後通過發佈一個包含要寫入哪個文件的參數的URL來更新它? – Mordy