1

我已經在AppEngine數據存儲之上實現了基本的文件上傳/下載。
我想要的功能是名爲「base.c」的文件將作爲文本文件打開。 所以我做了以下內容:
(當然我的代碼是一般情況下,但是這個具體的例子說明了這個問題)如何在用戶使用「另存爲」時選擇文件名?

resp.setContentType("text/plain"); 
resp.setHeader("Content-Disposition", "inline; filename=base.c"); 

這將打開它在瀏覽器中的文本文件,這是我需要的。
但我也希望當用戶使用瀏覽器的「保存頁面作爲..」選項時,它將提供「base.c」的初始名稱。 它在firefox(6)中的確如此,但它在chrome(15)和safari(5)上給出了默認名稱「download」。
更糟 - 當選擇base.c作爲文件名chrome警告用戶這是錯誤的擴展名並要求確認才能繼續。
現在,如果我使用「附件」而不是「內聯」,它不會打開文件,而是使用右邊的名稱下載它。

我能做些什麼來使默認保存爲.. name是「base.c」?
這是瀏覽器的錯誤還是我濫用HTTP頭?

(如果是任何幫助,所有的測試都是在OSX 10.6與下載網站是何許:
http://------.appspot.com/download?name=base.c

回答

0

我不知道,如果這是一個真實的答案,但是這可能會解決你的問題。您可以爲用戶提供在預覽和下載之間進行選擇的選項。這將解決您的問題

3

我想大多數瀏覽器默認頁面名稱作爲當前頁面的另存爲選項。

一個選項可能是通過使用web.xml中的url-pattern將URL從appspot/download?name = base.c更改爲appspot.com/download/base.c。

例如

<servlet-mapping> 
    <servlet-name>download</servlet-name> 
    <url-pattern>/download/*</url-pattern> 
</servlet-mapping> 

然後解析URL以從數據存儲中獲取文件名。

我很抱歉,如果這不適用GAE,我不熟悉它。

+0

文件系統上沒有實際的靜態文件。它由servlet從數據存儲中輸出。 – Danish94

+0

對不起,我不熟悉GAE。您是否嘗試過在web.xml配置中使用url-pattern?我編輯了我的答案 – scott

+2

@丹尼斯:這一定是有效的。你只需要通過'request.getPathInfo()。substring(1)'而不是'request.getParameter(「name」)'來獲取文件名。另請參閱http://balusc.blogspot.com/2007/07/fileservlet.html。 – BalusC

0

對於除attachment以外的任何值,您都不應該期待filename參數對Content-Disposition的尊重。 @scott建議您最好的選擇是修改您的URL映射,以便URL路徑以您想要的文件名結尾;這對用戶來說也更友好。另一個可以結合使用的選項是顯示格式化在HTML頁面中的文件,其中包含發送Content-Disposition: attachment的「原始」下載鏈接,就像GitHub一樣。

相關問題