2011-04-27 20 views
2

我試圖將文件從HTTP Servlet中發送給用戶。 servlet運行一些標識測試(根據請求),然後向客戶端發送一個文件。如何以「正確」的方式從servlet發送文件?

這通常工作,但現在我把我的Tomcat服務器上重定向到HTTPS,當我嘗試訪問的servlet和IE6或IE8下載文件失敗,我得到這個異常:

java.lang.IllegalStateException: Cannot forward after response has been committed 

(在localhost.log)

ClientAbortException: java.net.SocketException: Connection reset by peer: socket write error 

(在servlet日誌)

,做發送(簡體)代碼:

private void sendFile(HttpServletResponse response, byte[] file, String clientFileName) 
{ 
    ServletOutputStream op = null; 

    setContentType(response); 
    response.setHeader("Content-Disposition", "attachment; filename=\"" + clientFileName + "\""); 
    // send byte array to output buffer. 
    op = response.getOutputStream(); 

    // Content Length must be set after all processing done. 
    response.setContentLength((int) file.length); 
    op.write(file); 
} 

這是從一個servlet發送文件的正確方法是什麼?最好的方法是什麼?

謝謝!

UPDATE

用於從@BalusC條每頁代碼在此鏈接: http://balusc.blogspot.com/2007/07/fileservlet.html

這使得它的工作。

仍然Gmail,是因爲過濾階段的Gmail增加了在這些瀏覽器下載使用時,不會在IE6,IE8工作。

更新2

這個問題似乎是與Gmail + Internet Explorer的6-8。 我假設Gmail是做一個重定向(這實際上是很明顯的,如果你看一下頁面上的網址,你點擊郵件中的鏈接後)。 客戶拉技術是我唯一的解決方案嗎?

回答

0

的解決問題的方法是「客戶端拉」技術。 通過添加Refresh值的頭,我們讓瀏覽器要求的文件。

這是我能想到的唯一解決方案,克服了gmail在按下電子郵件中的鏈接時將使用重定向的事實。

在我這樣的代碼:

response.setHeader("Refresh", "3; URL=\"" + url.toString() + "\""); 
forwardToJSP(request, response, "waitForBrowserRefreshPage.jsp"); 

含義 - 3秒後要求用戶指定的URL,這將反過來,將文件傳送到客戶端。 的forwardToJSP方法顯示消息「你很快就會如果失敗轉發,這裏的鏈接」。

相關問題