話說,上回提供的無網址檔案下載,
我記得我有提過要是有問題的話,大概會出現在檔案太大的狀況
所以我只好秉持的實驗的精神證明這個問題。另外也上網找了一下檔案下載的方法
ASP.NET檔案下載總共有四種方式,分別為
1.HttpResponse.TransmitFile
2.HttpResponse.WriteFile
3.HttpResponse.BinaryWrite
4.HttpResponse.Redirect
這四種各有各的好處與壞處,我就一個一個實驗
說明一下實驗的環境
OS:Windows 2003 R2 (VM)
檔案類型:RAR壓縮檔
檔案大小:956MB
因為也沒別的機器了,所以就自己的XP當Client,VM內的2003當作Server端進行實驗,畫面也很簡單
1.HttpResponse.TransmitFile
點擊後,檔案過一會兒就開始下載了,速度則是受到網路環境影響,不再討論議題。
觀察w3wp.exe的記憶體狀況,沒有什麼變化,最後也是成功下載了檔案
2.HttpResponse.WriteFile
點擊後,系統停住,Server的w3wp.exe的記憶體開始飆高,最後因為受限於Server配備的限制出現無網頁狀態
3.HttpResponse.BinaryWrite
點擊後,系統停住,跟使用HttpResponse.WriteFile的狀況一樣,出現記憶體飆高的狀況。最後出現記憶體不足就中止下載了
4.HttpResponse.Redirect
跟HttpResponse.TransmitFile一樣,w3wp.exe記憶體正常,檔案正常下載。
查詢google大神後,綜合實驗結論得到下列的結論
1.HttpResponse.TransmitFile
A. 下載檔案由於採用無緩衝處理,所以可以下載比較大的檔案,且不會影響Server的效能
B. 只需要實體路徑(如C:\位置)的檔案就可以下載
C. 「聽說」無法下載內部網路Share的目錄檔案,也就是說如果有架設File Server,可能無法使此方法。
D. 無網址下載
2.HttpResponse.WriteFile
A. 只需要實體路徑(如C:\位置)的檔案就可以下載
B. 可以下載內部網路Share的目錄檔案,算是補強1方式的缺點
C. 會受到下載檔案大小影響到主機效能
D. 無網址下載
3.HttpResponse.BinaryWrite
A. 只需要實體路徑(如C:\位置)的檔案就可以下載
B. 會受到下載檔案大小影響到主機效能
C. 如果檔案存在於資料庫中,可透過此方式直接下載。例如HttpResponse.BinaryWrite((byte[])dt.Rows[0]["檔案欄位"])
D. 無網址下載
4.HttpResponse.Redirect
A. 受限於相對路徑中,也就是檔案必須在站台底下的目錄或者是虛擬目錄
B. 不受檔案大小影響Server效能
C. 有暴露網址的可能
所以綜合來看,
如果在意安全性的話,就選擇1、2、3
如果下載的檔案有可能很大,就選擇1、4
如果需要使用share目錄的狀況時,就選擇2、3、4
如果檔案採二進位的方式放在資料庫,就選擇3
最後在分享一段簡單的範例
/// <summary> if (parFilePath.StartsWith(@"\\")) parPage.Response.TransmitFile(FilePath); |
大概是這樣,謝謝收看
...
...
迷之聲「那第一篇是......?」
我『那是我學藝不精啦!!(哭著跑開)』