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-Type
和Content-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示例。
注意:您無法控制客戶端將保存圖像的位置,這將是一個安全漏洞。通過這種方式,網站可以在客戶端磁盤上寫入惡意文件。
更新:根據您的更新,有兩種選擇:
你需要讓客戶本身火二人HTTP請求(我在your subsequent question回答了這個)
創建一個客戶端應用程序,它直接在客戶端執行所有任務,然後將其嵌入到您的網頁中,例如Java Applet。通過小程序,您可以完全控制客戶端環境。你可以執行幾乎所有你想執行的Java代碼,你可以可以直接寫入文件到磁盤,而不要求客戶端保存位置。您只需要由第三方公司簽署小程序,或者客戶需要在運行之前確認安全警告。