이 글은 주로 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>"); } }
에서 다운로드할 수 있는 일부 파일이 저장됩니다. 여기서 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를 호출하기 때문에 발생합니다.
제공되는 솔루션은 다음과 같습니다.
이 문제를 해결하려면 다음 방법 중 하나를 사용하세요.
응답의 경우 .End , Response.End 대신 HttpContext.Current.ApplicationInstance.CompleteRequest() 메서드를 호출하여 Application_EndRequest 이벤트에 대한 코드 실행을 건너뜁니다.
Response.Redirect의 경우 endResponse 매개변수에 false를 전달하여 Response에 대한 응답을 취소하는 오버로드 Response.Redirect(String url, bool endResponse)를 사용합니다. .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 중국어 웹사이트를 주목하세요!