2010-06-03 169 views
1

我是新來的,只是在J2EE上開發。 我正在修改現有的應用程序(一個OpenSource項目)。 我需要保存服務器發送的客戶端上的圖像,但我不知道如何。 此活動必須以透明的方式完成,而不會影響應用程序的現有操作。Servlet從服務器發送圖像並保存在客戶端

從完成的測試中,我得到這個錯誤: java.lang.IllegalStateException:getWriter()has already been Called for this response。

根據你自己的意見應該如何執行這個任務? 如何在本地保存客戶端的圖像?

更新

感謝您的答案。 我的問題是:

  1. 在服務器上生成圖像,而不是直接客戶端請求(沒有鏈接點擊網頁上),將圖片用其他服務組成的網絡上。
  2. 重建服務器上的圖像。
  3. 必須將此圖片發送給客戶端才能在本地保存。
  4. 所以我希望它出現一個窗口,您分配的目標圖像
  5. 加我希望其他應用程序不受此活動的影響。
  6. 該應用程序尚未投入生產。

非常感謝您的回覆。

回答

2

From the tests done I get this error: java.lang.IllegalStateException: getWriter() has Already Been Called for this response.

換句話說,你試圖圖像的二進制數據與HTML輸出的字符數據混合,或者你想這樣做的JSP,而不是一個Servlet。這確實不起作用。您需要發送圖像該HTML頁面專門迴應完全分開的請求。

在你的JSP/HTML頁面只是有一個鏈接到圖像,像這樣:

<a href="imageservlet/filename.gif">click to download image</a> 

然後,在一個servlet監聽的/imageservlet/*url-pattern,你只是從一些數據源獲取圖像作爲InputStream (例如從本地磁盤文件系統中獲取FileInputStream),然後將其寫入響應的通常Java IO方式的OutputStream

你只需要設置至少Content-Disposition響應頭爲attachment以確保客戶獲得另存爲彈出的對話,否則將直接在瀏覽器中顯示。設置Content-TypeContent-Length也很重要,以便瀏覽器知道服務器正在發送什麼,並可以預測下載可能需要多長時間。

response.setHeader("Content-Type", getServletContext().getMimeType(file.getName())); 
response.setHeader("Content-Length", String.valueOf(file.length())); 
response.setHeader("Content-Disposition", "attachment;filename=\"" + file.getName() + "\""); 

您可以在this article中找到完整的基本servlet示例。

注意:您無法控制客戶端將保存圖像的位置,這將是一個安全漏洞。通過這種方式,網站可以在客戶端磁盤上寫入惡意文件。


更新:根據您的更新,有兩種選擇:

  1. 你需要讓客戶本身火二人HTTP請求(我在your subsequent question回答了這個)

  2. 創建一個客戶端應用程序,它直接在客戶端執行所有任務,然後將其嵌入到您的網頁中,例如Java Applet。通過小程序,您可以完全控制客戶端環境。你可以執行幾乎所有你想執行的Java代碼,你可以可以直接寫入文件到磁盤,而不要求客戶端保存位置。您只需要由第三方公司簽署小程序,或者客戶需要在運行之前確認安全警告。

1

它取決於瀏覽器如何處理所有類型的輸出。給網頁提供一個瀏覽器可以理解的html內容類型,並最終呈現一個我們可以看到的頁面。圖像被賦予圖像/ jpeg等內容類型,這些圖像在頁面中呈現爲圖像等。爲了強制下載提示,需要使用二進制文件的內容類型而不是圖像的內容類型,以便瀏覽器強制下載比顯示圖像。爲了確保使用「application/octetstream」之類的東西......我無法準確回想起它,但很容易讓Google知道。

相關問題