2013-10-25 70 views
1

我有一個簡單的表與下載文件鏈接..從Servlet下載文件 - Chrome警告+下載後如何重定向用戶?

一切似乎工作正常,當我點擊下載,文件被發現在硬盤上,並提供給用戶。

我的問題是,當我檢查鉻我看到:

Resource interpreted as Document but transferred with MIME type application/octet-stream: "http://localhost:8080/fus-app/myUploadedFiles". 

它爲什麼會這麼說?

相關的代碼我已經是:

httpServletResponse.setContentType("application/octet-stream"); 
    httpServletResponse.setHeader("Content-Disposition", "attachment; filename=\"" + fileNameOnSystem + "\""); 

而且獎金的問題:

文件下載後,用戶仍然可以看到該頁面的表格,但我想重定向到一個不同的頁面。我怎樣才能做到這一點?

response.sendRiderect() 

似乎不起作用。

編輯:這是我提供的下載鏈接到用戶:

<form method="post" action="<%= request.getServletContext().getContextPath() +"/myUploadedFiles" %>"> 
    <input type="hidden" name="fileNameOnSystem" value="<%= rset.getString("fileNameOnSystem") %>" /> 
    <button type="submit" class="btn btn-default" />Download File </button> 
</form> 

回答

2

嘗試指定在你的下載鏈接的HTML5下載屬性:

<a href='http://example.com/archive.zip' download>Export</a> 

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#attr-download

對於重定向,這裏不是好消息Is it possible to forward or redirect from a servlet filter after the response has been committed? ...

HttpServletResponse的「已提交」狀態確實是 表示響應標頭是否已寫入底層套接字 的一種方式。一個「承諾」的迴應已經(至少)寫了第一個 行。由於響應的第一行包含代碼 ,因此您無法更改已提交的 響應的狀態代碼...並且這意味着將狀態更改爲3xx 以執行重定向已爲時過晚。同樣,你不能做一個本地轉發,因爲你已經開始發送響應 。

因此,在發送文件(這是一個已完成的響應)之後,您將無法對響應做更多的事情。但是,您可以先將它們轉發到另一個頁面上,然後顯示一條消息並最終觸發下載。

找到這個例子:

<html> 
<head> 
<meta http-equiv="refresh" content="5;url=http://server.com/file.zip"> 
</head> 
<body> 
Thank you for downloading file.zip! 
</body> 
</html> 
+0

謝謝您的回答,我已經編輯我的問題。實際上該文件位於驅動器的某個位置,所以我必須提供來自servlet的文件,我不能直接鏈接到該文件。 –

+0

系統上的文件名稱類似於:test1234.pdf,並且我知道它位於哪個目錄(如C:\ appuser \ test1234.pdf),因此我可以提供該文件。所以我只能提供某種參數給servlet,然後我放棄文件。 –

+0

您應該只能提供該servlet處理的URL。客戶端不知道它是否是實際的文件,或者您只是生成隨機位。因此,如果您的servlet處理woogie.com/somefile,則仍然可以在您的網頁上放置:'Export'。 – sdanzig