在ASP.NET中下載檔案的實現代碼

來源:互聯網
上載者:User

這是筆者常被問到的一個問題,如何通過ASP.NET來下載檔案,這個問題可大可小,我們先從小的開始。當我們要讓使用者下載一個檔案,最簡單的方式是通過Response.Redirect指令:

  Response.Redirect("test.doc")

  您可以把上面這行指令放在Button的Click事件當中,當使用者點擊按鈕之後,網頁就會被轉址到該word檔,造成下載的效果。

  但是這樣的下載有幾個問題:

1. 無法下載不存在的檔案:例如,我們若是想把程式動態(臨時)產生的文字,當作一個檔案下載的時候(也就是該檔案其實原先並不是真的存在,而是動態產生的),就無法下載。
2. 無法下載儲存於資料庫中的檔案:這是類似的問題,該檔案並沒有真的存在,只是被存放在資料庫中的某個位置(某筆記錄中的某個欄位)的時候,就無法下載。
3. 無法下載不存在於Web檔案夾中的檔案:檔案確實存在,但該檔案夾並不是可以分享出來的Web檔案夾,例如,該檔案的位置在C:/winnt,您總不會想要把該檔案夾當作Web檔案夾吧?這時候,由於您無法使用Redirect指向該位置,所以無法下載。
4. 下載檔案後,原本的頁面將會消失。

  典型的狀況是,我們要讓使用者下載一個.txt檔案,或是.csv格式的Excel檔案,但是...

1. 這個檔案可能是通過ASP.NET程式動態產生的,而不是確實存在於Server端的檔案;
2. 或是它雖然存在於伺服器端的某個實體位置,但我們並不想暴露這個位置(如果這個位置公開,很可能沒有許可權的使用者也可以在網址欄上輸入URL直接取得!!!)
3. 或是這個位置並不在網站虛擬路徑所在的檔案夾中。(例如C:/Windows/System32...)

  這時候,我們就得採用不同的方式: 複製代碼 代碼如下:Shared Function DownloadFile(ByVal WebForm As System.Web.UI.Page, ByVal FileNameWhenUserDownload As String, ByVal FileBody As String)
  WebForm.Response.ClearHeaders()
  WebForm.Response.Clear()
  WebForm.Response.Expires = 0
  WebForm.Response.Buffer = True
  WebForm.Response.AddHeader("Accept-Language", "zh-tw")
  '檔案名稱
  WebForm.Response.AddHeader("content-disposition", "attachment; filename=" & Chr(34) & System.Web.HttpUtility.UrlEncode(FileNameWhenUserDownload, System.Text.Encoding.UTF8) & Chr(34))
  WebForm.Response.ContentType = "Application/octet-stream"
  '檔案內容
  WebForm.Response.Write(FileBody)
  WebForm.Response.End()
End Function

  上面這段代碼是下載一個動態產生的文字檔,若這個檔案已經存在於伺服器端的實體路徑,則可以通過下面的函數: 複製代碼 代碼如下:Shared Sub DownloadFile(ByVal WebForm As System.Web.UI.Page, ByVal FileNameWhenUserDownload As String, ByVal FilePath As String)
  WebForm.Response.ClearHeaders()
  WebForm.Response.Clear()
  WebForm.Response.Expires = 0
  WebForm.Response.Buffer = True
  WebForm.Response.AddHeader("Accept-Language", "zh-tw")
  '檔案名稱
  WebForm.Response.AddHeader("content-disposition", "attachment; filename=" & Chr(34) & System.Web.HttpUtility.UrlEncode(FileNameWhenUserDownload, System.Text.Encoding.UTF8) & Chr(34))
  WebForm.Response.ContentType = "Application/octet-stream"
  '檔案內容
  WebForm.Response.Write(System.IO.File.ReadAllBytes(FilePath))
  WebForm.Response.End()
End Sub

上面這兩個下載檔案的的函數,應可解決大多數開發人員在ASP.NET當中的檔案下載問題。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.