首頁  >  文章  >  後端開發  >  ASP.NET實作從伺服器下載檔案問題處理

ASP.NET實作從伺服器下載檔案問題處理

高洛峰
高洛峰原創
2017-02-20 17:07:281429瀏覽

本文主要介紹了ASP.NET實作從伺服器下載檔案問題處理,具有很好的參考價值,以下跟著小編一起來看下吧

假設在伺服器的根目錄下有個名為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";
   // 把文件流发送到客户端
   Response.WriteFile(file.FullName);
   // 停止页面的执行
   //Response.End();  
HttpContext.Current.ApplicationInstance.CompleteRequest();
  }
  catch (Exception ex){
   Response.Write("<script>alert(&#39;系统出现以下错误://n" + ex.Message + "!//n请尽快与管理员联系.&#39;)</script>");
  }
 }

這個函數是下載功能的群組程序,其中path是文件的絕對路徑(包括檔名),name是檔名,這個程式是能夠運行的.其中如果將HttpContext.Current.ApplicationInstance.CompleteRequest();替換為Response.End(); 就會出現錯誤:異常:由於程式碼已經過最佳化或本機框架位於呼叫堆疊之上,無法計算表達式的值.但是這個錯誤不會影響程式的運作,雖然try能夠捕捉這個異常(不知道為什麼)

在網路上找了一些這個問題產生的原因:如果使用Response.End、Response.Redirect 或Server.Transfer 方法,將會出現ThreadAbortException 例外。您可以使用 try-catch 語句擷取此異常。 Response.End 方法終止頁的執行,並將此執行切換到應用程式的事件管線中Application_EndRequest 事件。不執行 Response.End 後面的程式碼行。此問題出現在 Response.Redirect 和 Server.Transfer 方法中,因為這兩種方法都在內部呼叫 Response.End。

提供的解決方法有:

要解決此問題,請使用下列方法之一:

對於Response .End,呼叫HttpContext.Current.ApplicationInstance.CompleteRequest() 方法而不是Response.End 以跳過Application_EndRequest 事件的程式碼執行。

對於Response.Redirect,請使用重載Response.Redirect(String url, bool endResponse),該重載對endResponse 參數傳遞false 以取消對Response .End 的內部呼叫。 例如:

Response.Redirect ("nextpage.aspx", false);
 catch (System.Threading.ThreadAbortException e){
  throw;
 }
 接下来就可以通过其他函数或者事件调用这个函数来下载服务器上的文件了
 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(&#39;系统出现以下错误://n" + exp.Message + "!//n请尽快与管理员联系.&#39;)</script>");
  }
 }

從這個事件可以看出DownloadFile函數的第一個參數為文件的絕對路徑不然程式會報錯。

更多ASP.NET實作從伺服器下載檔案問題處理相關文章請關注PHP中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn