網(wǎng)站不僅僅只包含網(wǎng)頁,有時你需要提供用戶能下載的文件。將你的文件放到服務(wù)器上并在網(wǎng)頁中附上鏈接只是第一步,你還需意識到HTTP響應(yīng)的頭文件影響文件下載。
提示一:強制下載并控制文件名
在HTML中提供一個下載鏈接很簡單:
<
a
href
=
"http://download.httpwatch.com/httpwatch.exe"
>Download<
a
>
對于瀏覽器不知道如何呈現(xiàn)的二進制文件,如安裝程序和ZIP文件,這工作的很好。這會出現(xiàn)一個對話框,允許用戶將文件存儲到本地。
問題在于,如果文件能呈現(xiàn)自己,不同的瀏覽器行為就不一樣。例如,如果你鏈接一個純文本文件,瀏覽器會打開它,不會提示保存下載。
你可以加入以下響應(yīng)頭文件強制使用文件下載對話框。
Content-Disposition: attachment; filename=<file name.ext>
頭部還可以控制默認的文件名,這可以幫助你方便的生成像getfile.aspx一樣的內(nèi)容,但你要提供一個更有意義的文件名給用戶。
對于靜態(tài)內(nèi)容,您可以在您的Web服務(wù)器手動配置額外的頭文件。例如,下面是在IIS中設(shè)置:
為動態(tài)生成的內(nèi)容,您需要在網(wǎng)頁的服務(wù)器端代碼中添加此頭部。
加入了頭部之后,瀏覽器總是提示用戶下載該文件:
提示2:使用有效的HTTP緩存
與任何其他內(nèi)容一樣,它值得設(shè)置HTTP緩存最大限度地提高下載速度,減少帶寬的成本。常規(guī)的內(nèi)容需要立即過期,或者被永遠緩存。
我們下載HTTP規(guī)范(RFC2616)的例子可以永遠被緩存,因為不希望改變它。在HttpWatch可以看到這些,我們設(shè)置了一個很長的過期時間,并將Cache-Control 的值設(shè)為“public”。
這樣將來下載文件就可以從本地瀏覽器緩存中或中間代理來傳輸。如果該文件頻繁變換,你可能需要它立即過期,以便總是下載新的副本。你可以通過設(shè)置Expires為-1或以往的任何日期。
提示3:不要破壞IE瀏覽器HTTPS下載
利用Cache-Control響應(yīng)頭部,人們可以很容易的使用無存儲和無緩存以防止任何一個文件緩存頻繁更新。
Cache-Control: no-store, no-cache
這在Firefox能工作,但在Internet Explorer就得要小心。它將這些標簽解釋為--正在是用HTTPS 時,內(nèi)容永遠不會存儲到磁盤,導(dǎo)致文件下載對話框在0%掛起幾分鐘。
它最終會顯示一條錯誤信息:
在post on Eric Lawrence’s IEInternals blog 這篇文章中,有更多關(guān)于此問題和其它原因的信息。
提示#4:不要忘了Setup Analytics
在你的的網(wǎng)站,你可能要一并跟蹤下載文件和其他指標;贘avaScript基礎(chǔ)的解決方案,如谷歌分析備受歡迎,但默認情況下不顯示文件下載。這是因為下載一個文件不會導(dǎo)致任何JavaScript的執(zhí)行。使用谷歌分析,您需要添加一個onlick處理程序來追蹤下載。
<
a
onclick
=
"pageTracker._trackPageview('/httpwatch.exe');"
href
=
"..."
>Download</
a
>
你可以看到文件開始下載之前谷歌分析被調(diào)用了。