ASP.NET實現(xiàn)從服務器下載文件問題處理
假設在服務器的根目錄下有個名為Download的文件夾,這個文件夾存放一些提供給引用程序下載的文件
public void DownloadFile(string path, string name){
try{
System.IO.FileInfo file = new System.IO.FileInfo(path);
Response.Clear();
Response.Charset = "GB2312";
Response.ContentEncoding = System.Text.Encoding.UTF8;
// 添加頭信息,為"文件下載/另存為"對話框指定默認文件名
Response.AddHeader("Content-Disposition", "attachment; filename=" + Server.UrlEncode(name));
// 添加頭信息,指定文件大小,讓瀏覽器能夠顯示下載進度
Response.AddHeader("Content-Length", file.Length.ToString());
// 指定返回的是一個不能被客戶端讀取的流,必須被下載
Response.ContentType = "application/ms-excel";
// 把文件流發(fā)送到客戶端
Response.WriteFile(file.FullName);
// 停止頁面的執(zhí)行
//Response.End();
HttpContext.Current.ApplicationInstance.CompleteRequest();
}
catch (Exception ex){
Response.Write("<script>alert('系統(tǒng)出現(xiàn)以下錯誤://n" + ex.Message + "!//n請盡快與管理員聯(lián)系.')</script>");
}
}
這個函數(shù)是下載功能的組程序,其中path是文件的絕對路徑(包括文件名),name是文件名,這個程序是能夠運行的.其中如果將HttpContext.Current.ApplicationInstance.CompleteRequest();替換為Response.End(); 就會出現(xiàn)一下錯誤:異常:由于代碼已經過優(yōu)化或者本機框架位于調用堆棧之上,無法計算表達式的值.但是這個錯誤不會影響程序的運行,雖然try能夠捕捉這個異常(不知道為什么)
在網上找了一些這個問題產生的原因:如果使用 Response.End、Response.Redirect 或 Server.Transfer 方法,將出現(xiàn)ThreadAbortException 異常。您可以使用 try-catch 語句捕獲此異常。Response.End 方法終止頁的執(zhí)行,并將此執(zhí)行切換到應用程序的事件管線中Application_EndRequest 事件。不執(zhí)行 Response.End 后面的代碼行。此問題出現(xiàn)在 Response.Redirect 和 Server.Transfer 方法中,因為這兩種方法均在內部調用 Response.End。
提供的解決方法有:
要解決此問題,請使用下列方法之一:
對于 Response.End,調用 HttpContext.Current.ApplicationInstance.CompleteRequest() 方法而不是 Response.End 以跳過 Application_EndRequest 事件的代碼執(zhí)行。
對于 Response.Redirect,請使用重載 Response.Redirect(String url, bool endResponse),該重載對 endResponse 參數(shù)傳遞 false 以取消對 Response.End 的內部調用。例如:
Response.Redirect ("nextpage.aspx", false);
catch (System.Threading.ThreadAbortException e){
throw;
}
接下來就可以通過其他函數(shù)或者事件調用這個函數(shù)來下載服務器上的文件了
protected void btnOutput_Click(object sender, EventArgs e){
try{
string strPath = Server.MapPath("/") + "Download//學生基本信息模版.xls";
DownloadFile(strPath, "學生基本信息模版.xls");
}
catch (Exception exp){
Response.Write("<script>alert('系統(tǒng)出現(xiàn)以下錯誤://n" + exp.Message + "!//n請盡快與管理員聯(lián)系.')</script>");
}
}
從這個事件可以看出DownloadFile函數(shù)的第一個參數(shù)為文件的絕對路徑不然程序會報錯。
以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!
相關文章
ASP.NET Core實現(xiàn)AES-GCM加密算法
這篇文章介紹了ASP.NET Core實現(xiàn)AES-GCM加密的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07
.net6環(huán)境下使用RestSharp請求GBK編碼網頁亂碼的解決方案
這篇文章介紹了.net6環(huán)境下使用RestSharp請求GBK編碼網頁亂碼的解決方案,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-12-12
詳解ASP.NET數(shù)據(jù)綁定操作中Repeater控件的用法
.NET中的Repeater控件支持數(shù)據(jù)模板,而且可以自由地定義樣式,這里我們就來詳解ASP.NET數(shù)據(jù)綁定操作中Repeater控件的用法,需要的朋友可以參考下2016-06-06
.Net Core 實現(xiàn)圖片驗證碼的實現(xiàn)示例
這篇文章主要介紹了.Net Core 實現(xiàn)圖片驗證碼的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-03-03
.NET?Core內存結構體系(Windows環(huán)境)底層原理解析
文章介紹了物理內存和虛擬內存的區(qū)別,以及Windows系統(tǒng)中虛擬內存的管理方式,物理內存是計算機硬件中的實際RAM,而虛擬內存是由操作系統(tǒng)管理的抽象內存層,感興趣的朋友一起看看吧2025-02-02
ASP.NET core Web中使用appsettings.json配置文件的方法
這篇文章主要給大家介紹了在ASP.NET core Web中使用appsettings.json配置文件的方法,文中給出了詳細的示例代碼,需要的朋友可以參考學習,下面來一起看看吧。2017-04-04

