話說,上回提供的無網址檔案下載,

我記得我有提過要是有問題的話,大概會出現在檔案太大的狀況

所以我只好秉持的實驗的精神證明這個問題。另外也上網找了一下檔案下載的方法

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端進行實驗,畫面也很簡單

2009-8-11 下午 11-19-26.png


1.HttpResponse.TransmitFile

點擊後,檔案過一會兒就開始下載了,速度則是受到網路環境影響,不再討論議題。

觀察w3wp.exe的記憶體狀況,沒有什麼變化,最後也是成功下載了檔案

2009-8-11 下午 10-58-44.png 


2.HttpResponse.WriteFile

點擊後,系統停住,Server的w3wp.exe的記憶體開始飆高,最後因為受限於Server配備的限制出現無網頁狀態

2009-8-11 下午 11-04-24.png 2009-8-11 下午 11-12-20.png


3.HttpResponse.BinaryWrite

點擊後,系統停住,跟使用HttpResponse.WriteFile的狀況一樣,出現記憶體飆高的狀況。最後出現記憶體不足就中止下載了

2009-8-11 下午 11-13-08.png 2009-8-11 下午 11-24-26.png


4.HttpResponse.Redirect

跟HttpResponse.TransmitFile一樣,w3wp.exe記憶體正常,檔案正常下載。

2009-8-11 下午 11-26-04.png 

 

查詢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>
        /// 檔案下載
        /// </summary>
        /// <param name="parPage">頁面(通常指定this)</param>
        /// <param name="parFilePath">檔案路徑(可為實體路徑、相對路徑、網路芳鄰路徑)</param>
        /// <param name="parFileName">指定的檔案名稱,需包含副檔名</param>
        public void FileDownload(Page parPage, string parFilePath, string parFileName)
        {
            parPage.Response.Clear();
            parPage.Response.ClearHeaders();
            parPage.Response.AddHeader("content-disposition", "attachment; filename=" + parFileName);
           
            string FilePath = "";

            if (parFilePath.StartsWith(@"\\"))
            {
                FilePath = parFilePath;
                parPage.Response.WriteFile(FilePath, false);
            }
            else
            {
                if (parFilePath.StartsWith(@"/") || parFilePath.StartsWith(@"~"))
                {
                    FilePath = parPage.Server.MapPath(parFilePath);
                }
                else
                {
                    FilePath = parFilePath;
                }

                parPage.Response.TransmitFile(FilePath);
            }
        }

大概是這樣,謝謝收看039_跪拜禮.gif

...

...

迷之聲「那第一篇是......?」
我『那是我學藝不精啦!!(哭著跑開)』

arrow
arrow
    全站熱搜

    gogo1119 發表在 痞客邦 留言(1) 人氣()