この記事では主に 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('系统出现以下错误://n" + ex.Message + "!//n请尽快与管理员联系.')</script>"); } }
この関数は、ダウンロード関数のグループ プログラムであり、パスはファイルの絶対パス (ファイル名を含む)、 name がファイル名である場合、このプログラムは実行できます。 HttpContext.Current.ApplicationInstance.CompleteRequest(); を Response.End(); に置き換えると、次のエラーが表示されます。または、ネイティブ フレームワークがコール スタックの上にあります。ただし、このエラーはプログラムの実行には影響しません (理由はわかりません)。インターネット上のこの問題: Response.End、Response.Redirect、または Server メソッドを使用すると、ThreadAbortException 例外が発生します。この例外は、try-catch ステートメントを使用してキャッチできます。 Response.End メソッドはページの実行を終了し、アプリケーションのイベント パイプラインの Application_EndRequest イベントに実行を切り替えます。 Response.End に続くコード行は実行されません。この問題は、Response.Redirect メソッドと Server.Transfer メソッドで両方のメソッドが内部で Response.End を呼び出すために発生します。
提供される解決策は次のとおりです:この問題を解決するには、次のいずれかの方法を使用します:
Response.End の場合、Response.End の代わりに HttpContext.Current.ApplicationInstance.CompleteRequest() メソッドを呼び出します。 Application_EndRequest イベントのコード実行をスキップします。
Response.Redirect の場合、endResponse パラメーターに false を渡すオーバーロード Response.Redirect(String url, bool endResponse) を使用して、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('系统出现以下错误://n" + exp.Message + "!//n请尽快与管理员联系.')</script>"); } }
このイベントから、DownloadFile 関数の最初のパラメーターがファイルの絶対パスであることがわかります。それ以外の場合、プログラムはエラーを報告します。
サーバーからファイルをダウンロードする ASP.NET の実装に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。