

網(wǎng)站不僅僅只包含網(wǎng)頁,有時(shí)你需要提供用戶能下載的文件。將你的文件放到服務(wù)器上并在網(wǎng)頁中附上鏈接只是第一步,你還需意識(shí)到HTTP響應(yīng)的頭文件影響文件下載。
提示一:強(qiáng)制下載并控制文件名
在HTML中提供一個(gè)下載鏈接很簡單:
<a href="http://download.httpwatch.com/httpwatch.exe">Download<a>
對(duì)于瀏覽器不知道如何呈現(xiàn)的二進(jìn)制文件,如安裝程序和ZIP文件,這工作的很好。這會(huì)出現(xiàn)一個(gè)對(duì)話框,允許用戶將文件存儲(chǔ)到本地。

問題在于,如果文件能呈現(xiàn)自己,不同的瀏覽器行為就不一樣。例如,如果你鏈接一個(gè)純文本文件,瀏覽器會(huì)打開它,不會(huì)提示保存下載。

你可以加入以下響應(yīng)頭文件強(qiáng)制使用文件下載對(duì)話框。
Content-Disposition: attachment; filename=<file name.ext>
頭部還可以控制默認(rèn)的文件名,這可以幫助你方便的生成像getfile.aspx一樣的內(nèi)容,但你要提供一個(gè)更有意義的文件名給用戶。
對(duì)于靜態(tài)內(nèi)容,您可以在您的Web服務(wù)器手動(dòng)配置額外的頭文件。例如,下面是在IIS中設(shè)置:

為動(dòng)態(tài)生成的內(nèi)容,您需要在網(wǎng)頁的服務(wù)器端代碼中添加此頭部。
加入了頭部之后,瀏覽器總是提示用戶下載該文件:

提示2:使用有效的HTTP緩存
與任何其他內(nèi)容一樣,它值得設(shè)置HTTP緩存最大限度地提高下載速度,減少帶寬的成本。常規(guī)的內(nèi)容需要立即過期,或者被永遠(yuǎn)緩存。
我們下載HTTP規(guī)范(RFC2616)的例子可以永遠(yuǎn)被緩存,因?yàn)椴幌M淖兯。在HttpWatch可以看到這些,我們?cè)O(shè)置了一個(gè)很長的過期時(shí)間,并將Cache-Control 的值設(shè)為“public”。

這樣將來下載文件就可以從本地瀏覽器緩存中或中間代理來傳輸。如果該文件頻繁變換,你可能需要它立即過期,以便總是下載新的副本。你可以通過設(shè)置Expires為-1或以往的任何日期。
提示3:不要破壞IE瀏覽器HTTPS下載
利用Cache-Control響應(yīng)頭部,人們可以很容易的使用無存儲(chǔ)和無緩存以防止任何一個(gè)文件緩存頻繁更新。
Cache-Control: no-store, no-cache
這在Firefox能工作,但在Internet Explorer就得要小心。它將這些標(biāo)簽解釋為--正在是用HTTPS 時(shí),內(nèi)容永遠(yuǎn)不會(huì)存儲(chǔ)到磁盤,導(dǎo)致文件下載對(duì)話框在0%掛起幾分鐘。

它最終會(huì)顯示一條錯(cuò)誤信息:

在post on Eric Lawrence’s IEInternals blog 這篇文章中,有更多關(guān)于此問題和其它原因的信息。
提示#4:不要忘了Setup Analytics
在你的的網(wǎng)站,你可能要一并跟蹤下載文件和其他指標(biāo);贘avaScript基礎(chǔ)的解決方案,如谷歌分析備受歡迎,但默認(rèn)情況下不顯示文件下載。這是因?yàn)橄螺d一個(gè)文件不會(huì)導(dǎo)致任何JavaScript的執(zhí)行。使用谷歌分析,您需要添加一個(gè)onlick處理程序來追蹤下載。
<a onclick="pageTracker._trackPageview('/httpwatch.exe');" href="...">Download</a>
你可以看到文件開始下載之前谷歌分析被調(diào)用了。