ASP.NET中下载文件的实现
2009-12-28 18:55
351 查看
这是常被问到的一个问题,如何通过ASP.NET来下载文件,这个问题可大可小,我们先从小的开始。当我们要让用户下载一个文件,最简单的方式是通过Response.Redirect指令: Response.Redirect("test.doc") 您可以把上面这行指令放在Button的Click事件当中,当用户点击按钮之后,网页就会被转址到该word档,造成下载的效果。 但是这样的下载有几个问题: 1. 无法下载不存在的文件:例如,我们若是想把程序动态(临时)产生的文字,当作一个文件下载的时候(也就是该文件其实原先并不是真的存在,而是动态产生的),就无法下载。 2. 无法下载存储于数据库中的文件:这是类似的问题,该文件并没有真的存在,只是被存放在数据库中的某个位置(某笔记录中的某个栏位)的时候,就无法下载。 3. 无法下载不存在于Web文件夹中的文件:文件确实存在,但该文件夹并不是可以分享出来的Web文件夹,例如,该文件的位置在C:\winnt,您总不会想要把该文件夹当作Web文件夹吧?这时候,由于您无法使用Redirect指向该位置,所以无法下载。 4. 下载文件后,原本的页面将会消失。 典型的状况是,我们要让用户下载一个.txt文件,或是.csv格式的Excel文件,但是... 1. 这个文件可能是通过ASP.NET程序动态产生的,而不是确实存在于Server端的文件; 2. 或是它虽然存在于伺服器端的某个实体位置,但我们并不想暴露这个位置(如果这个位置公开,很可能没有权限的用户也可以在网址栏上输入URL直接取得!!!) 3. 或是这个位置并不在网站虚拟路径所在的文件夹中。(例如C:\Windows\System32...) 这时候,我们就得采用不同的方式: Shared Function DownloadFile(ByVal WebForm As System.Web.UI.Page, ByVal FileNameWhenUserDownload As String, ByVal FileBody As String) WebForm.Response.ClearHeaders() WebForm.Response.Clear() WebForm.Response.Expires = 0 WebForm.Response.Buffer = True WebForm.Response.AddHeader("Accept-Language", "zh-tw") '文件名称 WebForm.Response.AddHeader("content-disposition", "attachment; filename=" & Chr(34) & System.Web.HttpUtility.UrlEncode(FileNameWhenUserDownload, System.Text.Encoding.UTF8) & Chr(34)) WebForm.Response.ContentType = "Application/octet-stream" '文件内容 WebForm.Response.Write(FileBody) WebForm.Response.End() End Function 上面这段代码是下载一个动态产生的文本文件,若这个文件已经存在于服务器端的实体路径,则可以通过下面的函数: Shared Sub DownloadFile(ByVal WebForm As System.Web.UI.Page, ByVal FileNameWhenUserDownload As String, ByVal FilePath As String) WebForm.Response.ClearHeaders() WebForm.Response.Clear() WebForm.Response.Expires = 0 WebForm.Response.Buffer = True WebForm.Response.AddHeader("Accept-Language", "zh-tw") '文件名称 WebForm.Response.AddHeader("content-disposition", "attachment; filename=" & Chr(34) & System.Web.HttpUtility.UrlEncode(FileNameWhenUserDownload, System.Text.Encoding.UTF8) & Chr(34)) WebForm.Response.ContentType = "Application/octet-stream" '文件内容 WebForm.Response.Write(System.IO.File.ReadAllBytes(FilePath)) WebForm.Response.End() End Sub 上面这两个下载文件的的函数,应可解决大多数开发人员在ASP.NET当中的文件下载问题。 More...... //TransmitFile实现下载 protected void Button1_Click(object sender, EventArgs e) { /* 微软为Response对象提供了一个新的方法TransmitFile来解决使用Response.BinaryWrite 下载超过400mb的文件时导致Aspnet_wp.exe进程回收而无法成功下载的问题。 代码如下: */ Response.ContentType = "application/x-zip-compressed"; Response.AddHeader("Content-Disposition", "attachment;filename=z.zip"); string filename = Server.MapPath("DownLoad/z.zip"); Response.TransmitFile(filename); } //WriteFile实现下载 protected void Button2_Click(object sender, EventArgs e) { FileDown(name[name.Length - 1].ToString(), strPath); } private void FileDown(string strName, string strPath) { //这里使用的是函数调用,必须进行创建新的字符串,否则回出错,不知为什么。不进行函数调用,就没有问题。 string fileName = strName;//客户端保存的文件名 string filePath = Server.MapPath(strPath);//路径 System.IO.FileInfo fileInfo = new System.IO.FileInfo(filePath); if (fileInfo.Exists) { Response.Clear(); Response.ClearContent(); Response.ClearHeaders(); Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName); Response.AddHeader("Content-Length", fileInfo.Length.ToString()); Response.AddHeader("Content-Transfer-Encoding", "binary"); Response.ContentType = "application/octet-stream"; Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312"); Response.WriteFile(fileInfo.FullName); Response.Flush(); Response.End(); } else { ClientScript.RegisterStartupScript(GetType(), "", "<script language='javascript'>alert('文件不存在!');</script>"); } } /// <summary> /// 以指定的ContentType输出指定文件文件 /// </summary> /// <param name="filepath">文件路径</param> /// <param name="filename">输出的文件名</param> /// <param name="filetype">将文件输出时设置的ContentType</param> public static void ResponseFile(string filepath, string filename, string filetype) { Stream iStream = null; // 缓冲区为10k byte[] buffer = new Byte[10000]; // 文件长度 int length; // 需要读的数据长度 long dataToRead; try { // 打开文件 iStream = new FileStream(filepath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); // 需要读的数据长度 dataToRead = iStream.Length; HttpContext.Current.Response.ContentType = filetype; HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + Utils.UrlEncode(filename.Trim()).Replace("+", " ")); while (dataToRead > 0) { // 检查客户端是否还处于连接状态 if (HttpContext.Current.Response.IsClientConnected) { length = iStream.Read(buffer, 0, 10000); HttpContext.Current.Response.OutputStream.Write(buffer, 0, length); HttpContext.Current.Response.Flush(); buffer = new Byte[10000]; dataToRead = dataToRead - length; } else { // 如果不再连接则跳出死循环 dataToRead = -1; } } } catch (Exception ex) { HttpContext.Current.Response.Write("Error : " + ex.Message); } finally { if (iStream != null) { // 关闭文件 iStream.Close(); } } HttpContext.Current.Response.End(); } //WriteFile分块下载 protected void Button3_Click(object sender, EventArgs e) { string fileName = "aaa.txt";//客户端保存的文件名 string filePath = Server.MapPath("DownLoad/aaa.txt");//路径 System.IO.FileInfo fileInfo = new System.IO.FileInfo(filePath); if (fileInfo.Exists == true) { const long ChunkSize = 102400;//100K 每次读取文件,只读取100K,这样可以缓解服务器的压力 byte[] buffer = new byte[ChunkSize]; Response.Clear(); System.IO.FileStream iStream = System.IO.File.OpenRead(filePath); long dataLengthToRead = iStream.Length;//获取下载的文件总大小 Response.ContentType = "application/octet-stream"; Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName)); while (dataLengthToRead > 0 && Response.IsClientConnected) { int lengthRead = iStream.Read(buffer, 0, Convert.ToInt32(ChunkSize));//读取的大小 Response.OutputStream.Write(buffer, 0, lengthRead); Response.Flush(); dataLengthToRead = dataLengthToRead - lengthRead; } Response.Close(); } } //流方式下载 protected void Button4_Click(object sender, EventArgs e) { string fileName = "aaa.txt";//客户端保存的文件名 string filePath = Server.MapPath("DownLoad/aaa.txt");//路径 //以字符流的形式下载文件 FileStream fs = new FileStream(filePath, FileMode.Open); byte[] bytes = new byte[(int)fs.Length]; fs.Read(bytes, 0, bytes.Length); fs.Close(); Response.ContentType = "application/octet-stream"; //通知浏览器下载文件而不是打开 Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8)); Response.BinaryWrite(bytes); Response.Flush(); Response.End(); } //---------------------------------------------------------- public void DownloadFile( System.Web.UI.Page WebForm,String FileNameWhenUserDownload ,String FileBody ) { WebForm.Response.ClearHeaders(); WebForm.Response.Clear(); WebForm.Response.Expires = 0; WebForm.Response.Buffer = true; WebForm.Response.AddHeader("Accept-Language", "zh-tw"); //'文件名称 WebForm.Response.AddHeader("content-disposition", "attachment; filename='"+System.Web.HttpUtility.UrlEncode(FileNameWhenUserDownload, System.Text.Encoding.UTF8)+"'"); WebForm.Response.ContentType = "Application/octet-stream"; //'文件内容 WebForm.Response.Write(FileBody);//----------- WebForm.Response.End(); } //上面这段代码是下载一个动态产生的文本文件,若这个文件已经存在于服务器端的实体路径,则可以通过下面的函数: public void DownloadFileByFilePath( System.Web.UI.Page WebForm,String FileNameWhenUserDownload ,String FilePath ) { WebForm.Response.ClearHeaders(); WebForm.Response.Clear(); WebForm.Response.Expires = 0; WebForm.Response.Buffer = true; WebForm.Response.AddHeader("Accept-Language", "zh-tw"); //文件名称 WebForm.Response.AddHeader("content-disposition", "attachment; filename='" + System.Web.HttpUtility.UrlEncode(FileNameWhenUserDownload, System.Text.Encoding.UTF8) +"'" ); WebForm.Response.ContentType = "Application/octet-stream"; //文件内容 WebForm.Response.Write(System.IO.File.ReadAllBytes(FilePath));//--------- WebForm.Response.End(); } |
相关文章推荐
- ASP.NET实现文件下载
- asp.net 实现下载服务器上的文件
- asp.net文件上传下载的简单实现
- 使文件下载的自定义连接支持 FlashGet 的断点续传多线程链接下载! C#/ASP.Net 实现!
- ASP.NET 大文件下载的实现思路及代码
- ASP.NET Web Api 2实现多文件打包并下载文件的实例
- iOS开发之结合asp.net webservice实现文件上传下载
- ASP.NET实现批量下载文件及附件的方法详细讲解
- [导入]ASP.NET 2.0 HttpHandler实现对某种文件类型权限保护(示例代码下载)
- asp.net 实现文件下载
- ASP.net实现文件下载
- asp.net 文件下载实现代码
- Asp.net 2.0 用 FileUpload 控件实现多文件上传 用户控件(示例代码下载)
- asp.net(c#)文件下载实现代码
- 拥有网页版小U盘 ASP.NET实现文件上传与下载功能
- asp.net 实现数据流文件下载
- ASP.NET实现从服务器下载文件
- ASP.NET实现文件下载
- asp.net 文件下载实现代码
- 怎样在asp.net中用一般处理文件ashx实现下载功能