`

asp.net文件下载的几种方式

阅读更多

摘自:http://zhidao.baidu.com/question/171876794.html

阅:经验证,//使用WriteFile下载文件 这个方法,是可以用的;

asp.net2.0以后,我们有了很多种文件下载的选择。

public partial class FileDownLoad : System.Web.UI.Page   
    {   
        //提供下载的文件,不编码的话文件名会乱码   
        private string fileName = HttpContext.Current.Server.UrlEncode("规范.rar");   
        private string filePath = HttpContext.Current.Server.MapPath("规范.rar");   
        //使用TransmifFile下载文件   
        protected void btnDL1_Click(object sender, EventArgs e)   
        {   
            FileInfo info = new FileInfo(filePath);   
            long fileSize = info.Length;   
            Response.Clear();   
            Response.ContentType = "application/x-zip-compressed";   
            Response.AddHeader("Content-Disposition", "attachment;filename="+ fileName);   
            //不指明Content-Length用Flush的话不会显示下载进度   
            Response.AddHeader("Content-Length", fileSize.ToString());   
            Response.TransmitFile(filePath, 0, fileSize);   
            Response.Flush();   
            Response.Close();   
        }   
  
        //使用WriteFile下载文件   
        protected void btnDL2_Click(object sender, EventArgs e)   
        {   
            FileInfo info = new FileInfo(filePath);   
            long fileSize = info.Length;   
            Response.Clear();   
            Response.ContentType = "application/octet-stream";   
            Response.AddHeader("Content-Disposition", "attachement;filename=" + fileName);   
            //指定文件大小   
            Response.AddHeader("Content-Length", fileSize.ToString());   
            Response.WriteFile(filePath, 0, fileSize);   
            Response.Flush();   
            Response.Close();   
        }   
  
        //使用OutputStream.Write分块下载文件   
        protected void btnDL3_Click(object sender, EventArgs e)   
        {   
            //指定块大小   
            long chunkSize = 102400;   
            //建立一个100K的缓冲区   
            byte[] buffer = new byte[chunkSize];   
            //已读的字节数   
            long dataToRead = 0;   
            FileStream stream = null;   
            try    
            {   
                //打开文件   
                stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);   
                dataToRead = stream.Length;   
  
                //添加Http头   
                Response.ContentType = "application/octet-stream";   
                Response.AddHeader("Content-Disposition", "attachement;filename=" + fileName);   
                Response.AddHeader("Content-Length", dataToRead.ToString());   
  
                while (dataToRead > 0)    
                {   
                    if (Response.IsClientConnected)   
                    {   
                        int length = stream.Read(buffer, 0, Convert.ToInt32(chunkSize));   
                        Response.OutputStream.Write(buffer, 0, length);   
                        Response.Flush();   
                        Response.Clear();   
                        dataToRead -= length;   
                    }   
                    else    
                    {   
                        //防止client失去连接   
                        dataToRead = -1;   
                    }   
                }   
            }   
            catch (Exception ex)   
            {   
                Response.Write("Error:" + ex.Message);   
            }   
            finally    
            {   
                if (stream != null)    
                {   
                    stream.Close();   
                }   
                Response.Close();   
            }   
        }   
  
        //使用BinaryWrite下载文件,大文件效率不行   
        protected void btnDL4_Click(object sender, EventArgs e)   
        {   
            FileStream stream = null;   
            try    
            {   
                //读文件,大文件一次读入会占用大量内存   
                stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);   
                byte[] bytes = new byte[stream.Length];   
                stream.Read(bytes, 0, bytes.Length);   
                stream.Close();   
  
                //添加Http头   
                Response.ContentType = "application/octet-stream";   
                Response.AddHeader("Content-Disposition", "attachement;filename=" + fileName);   
                Response.AddHeader("Content-Length", bytes.Length.ToString());   
                Response.BinaryWrite(bytes);   
                Response.Flush();   
            }   
            catch (Exception ex)   
            {   
                Response.Write("Error:" + ex.Message);   
            }   
            finally    
            {   
                if (stream != null)    
                {   
                    stream.Close();   
                }   
                Response.Close();   
            }   
        }   
        //使用BinaryWrite分块下载文件   
        protected void btnDL5_Click(object sender, EventArgs e)   
        {   
            //指定区块和缓冲区   
            long chunkSize = 102400;   
            byte[] buffer = new byte[chunkSize];   
            FileStream stream = null;   
            long dataToRead = 0;   
            try    
            {   
                stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);   
                dataToRead = stream.Length;   
                //添加Http头   
                Response.ContentType = "application/octet-stream";   
                Response.AddHeader("Content-Disposition", "attachement;filename=" + fileName);   
                Response.AddHeader("Content-Length", dataToRead.ToString());   
  
                while (dataToRead > 0)    
                {   
                    if (Response.IsClientConnected)   
                    {   
                        int length = stream.Read(buffer, 0, Convert.ToInt32(chunkSize));   
                        Response.BinaryWrite(buffer);   
                        Response.Flush();   
                        Response.Clear();   
  
                        dataToRead -= length;   
                    }   
                    else    
                    {   
                        dataToRead = -1;   
                    }   
                }   
  
            }   
            catch(Exception ex)   
            {   
                Response.Write("Error:" + ex.Message);   
            }   
            finally  
            {   
                if (stream != null)    
                {   
                    stream.Close();   
                }   
                Response.Close();   
            }   
        }   
    } 
public partial class FileDownLoad : System.Web.UI.Page { //提供下载的文件,不编码的话文件名会乱码 private string fileName = HttpContext.Current.Server.UrlEncode("规范.rar"); private string filePath = HttpContext.Current.Server.MapPath("规范.rar"); //使用TransmifFile下载文件 protected void btnDL1_Click(object sender, EventArgs e) { FileInfo info = new FileInfo(filePath); long fileSize = info.Length; Response.Clear(); Response.ContentType = "application/x-zip-compressed"; Response.AddHeader("Content-Disposition", "attachment;filename="+ fileName); //不指明Content-Length用Flush的话不会显示下载进度 Response.AddHeader("Content-Length", fileSize.ToString()); Response.TransmitFile(filePath, 0, fileSize); Response.Flush(); Response.Close(); } //使用WriteFile下载文件 protected void btnDL2_Click(object sender, EventArgs e) { FileInfo info = new FileInfo(filePath); long fileSize = info.Length; Response.Clear(); Response.ContentType = "application/octet-stream"; Response.AddHeader("Content-Disposition", "attachement;filename=" + fileName); //指定文件大小 Response.AddHeader("Content-Length", fileSize.ToString()); Response.WriteFile(filePath, 0, fileSize); Response.Flush(); Response.Close(); } //使用OutputStream.Write分块下载文件 protected void btnDL3_Click(object sender, EventArgs e) { //指定块大小 long chunkSize = 102400; //建立一个100K的缓冲区 byte[] buffer = new byte[chunkSize]; //已读的字节数 long dataToRead = 0; FileStream stream = null; try { //打开文件 stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read); dataToRead = stream.Length; //添加Http头 Response.ContentType = "application/octet-stream"; Response.AddHeader("Content-Disposition", "attachement;filename=" + fileName); Response.AddHeader("Content-Length", dataToRead.ToString()); while (dataToRead > 0) { if (Response.IsClientConnected) { int length = stream.Read(buffer, 0, Convert.ToInt32(chunkSize)); Response.OutputStream.Write(buffer, 0, length); Response.Flush(); Response.Clear(); dataToRead -= length; } else { //防止client失去连接 dataToRead = -1; } } } catch (Exception ex) { Response.Write("Error:" + ex.Message); } finally { if (stream != null) { stream.Close(); } Response.Close(); } } //使用BinaryWrite下载文件,大文件效率不行 protected void btnDL4_Click(object sender, EventArgs e) { FileStream stream = null; try { //读文件,大文件一次读入会占用大量内存 stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read); byte[] bytes = new byte[stream.Length]; stream.Read(bytes, 0, bytes.Length); stream.Close(); //添加Http头 Response.ContentType = "application/octet-stream"; Response.AddHeader("Content-Disposition", "attachement;filename=" + fileName); Response.AddHeader("Content-Length", bytes.Length.ToString()); Response.BinaryWrite(bytes); Response.Flush(); } catch (Exception ex) { Response.Write("Error:" + ex.Message); } finally { if (stream != null) { stream.Close(); } Response.Close(); } } //使用BinaryWrite分块下载文件 protected void btnDL5_Click(object sender, EventArgs e) { //指定区块和缓冲区 long chunkSize = 102400; byte[] buffer = new byte[chunkSize]; FileStream stream = null; long dataToRead = 0; try { stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read); dataToRead = stream.Length; //添加Http头 Response.ContentType = "application/octet-stream"; Response.AddHeader("Content-Disposition", "attachement;filename=" + fileName); Response.AddHeader("Content-Length", dataToRead.ToString()); while (dataToRead > 0) { if (Response.IsClientConnected) { int length = stream.Read(buffer, 0, Convert.ToInt32(chunkSize)); Response.BinaryWrite(buffer); Response.Flush(); Response.Clear(); dataToRead -= length; } else { dataToRead = -1; } } } catch(Exception ex) { Response.Write("Error:" + ex.Message); } finally { if (stream != null) { stream.Close(); } Response.Close(); } } }


以上除了第四种不推荐以外,其他的都可以,但是个人感觉分块下载的要好一点。没有仔细测试,所以可能有问题。

注意:对于中文文件名要编码才能正确显示。对于长中文文件名(UTF8编码后大于153字节的中文)即使编码了,还是有问题的,大家可以参考这个链接。
http://hi.baidu.com/river_5566/blog/item/d66804cef8afb031b700c863.html
分享到:
评论

相关推荐

    ASP.NET页面之间传递值的几种方式(txt文件)

    ASP.NET页面之间传递值的几种方式,ASP.NET页面之间传递值的几种方式,ASP.NET页面之间传递值的几种方式

    ASP.NET学习大全

    ASP.NET文件上传程序的源代码.txt Asp.Net中文本换行.txt ASPNET中实现在线用户检测(使用后台守护线程).txt C# 读取计算机CPU,HDD信息.txt DataGrid导出EXCEL的几个方法(WebControl).txt DataGrid的打印预览和...

    ASP.Net MVC 文件下载的几种方法

     在后台下载中又可以细分为几种下载方式  首先,在前台,我们需要一个标签  <a>Click to get file  Home为controller,download为action。  如果需要传一些参数,可以:  <a>Click to get file  在...

    ASP.NET文件上传下载方法集合

    文件的上传下载是我们在实际项目开发过程中经常需要用到的技术,这里给出几种常见的方法,本文主要内容包括:  1、如何解决文件上传大小的限制  2、以文件形式保存到服务器  3、转换成二进制字节流保存到...

    asp.net学习大全(超全面的资料整合)

    ASP.NET文件上传程序的源代码.txt Asp.Net中文本换行.txt ASPNET中实现在线用户检测(使用后台守护线程).txt C# 读取计算机CPU,HDD信息.txt DataGrid导出EXCEL的几个方法(WebControl).txt DataGrid的打印预览和...

    十天学会ASP.net--我认为ASP.NET比ASP难很多,希望大家做好准备

    这样ASP.NET就有四种组合:VB+ACCESS,VB+SQL,C#+ACCESS,C#+SQL,本教程会使用C#+ACCESS,兼顾四种来写,让大家对ASP.NET有一个全面的认识。虽然说学习ASP.NET不需要任何ASP基础,但是我觉得如果大家ASP不会,还是...

    ASP.NET中文件上传下载方法集合

    ASP.NET中文件上传下载方法集合的几种方法

    ASP.NET应用开发案例教程

    8.3.4 其他几种客户端的用户状态管理方法 8.3.5 本小节提示 8.4 ASP.NETHTFP运行情况 8.4.1 HTFP运行情况介绍 8.4.2 HTFP处理程序 8.5 小结 8.6 习题 第9章 ASP.NET与XML 9.1 XML简介 9.1.1...

    ASP.NET应用与开发案例教程

    8.3.4其他几种客户端的用户状态管理方法 8.3.5本小节提示 8.4ASP.NETHTFP运行情况 8.4.1HTYP运行‘晴况介绍 8.4.2HTFP处理程序 8.5小结 8.6习题 第9章ASP.NET与XML 9.1XML简介 9.1.1什么是标记语言 9.1.2HTML的弊病 ...

    Asp.Net Mvc 大文件上传,带进度条,附源码下载.rar

    环境 Asp.Net Mvc3 Vs2010 使用的脚本 jquery-1.5.1.min.js 、jquery.flash.js、 jquery.jqUploader.js 配置Webconfig ...

    asp.net知识库

    在ASP.NET中使用WINDOWS验证方式连接SQL SERVER数据库 改进ADO.Net数据库访问方式 ASP.NET 2.0 绑定高级技巧 简单实用的DataSet更新数据库的类+总结 [ADO.NET]由数据库触发器引发的问题 为ASP.NET封装的SQL数据库...

    Asp.net把图片存入数据库和读取图片的方法

    网上关于ASP.NET上传图片到数据库的资料非常多,常用的如下:存储图片类型数据有以下几种方式:1.将图片转换为二进制数组(byte[]) 代码如下:byte[] fileData = this.FileUpload1.FileBytes; 2. 根据路径将文件转换...

    Asp.net实现多语言Demo.rar

    我实现多语言是利用了ASP.NET2.0的资源文件,其实据我所知除了资源文件的方式,在数据库里面建多个表中进行一个区域文化映射,也是解决国际化的一种方式(关于这种方式感兴趣的朋友可以自己试试) 现在我把实现国际化...

    ASP.NET的网页代码模型及生命周期

    在创建时,去掉【将代码放在单独的文件中】复选框的选择即可创建单文件页模型的ASP.NET文件。创建后文件会自动创建相应的HTML代码以便页面的初始化,示例代码如下所示。 “C#” %> <!DOCTYPE html PUBLIC “-//W3C/...

    asp.net导出数据到Excel的几种方法 学习心得

    asp.net导出到Excel也是个老生常谈的问题,在此归纳一下。 第一种是比较常用的方法。是利用控件的RenderControl功能,得到该控件生成的HTML,然后以Excel文件的类型输出到客户端。这种方法生成的其实是个HTML文件,...

    ASP.NET加密教程(MD5和SHA1加密几种方法)

    ASP.NET加密教程(MD5和SHA1加密几种方法) 很简单的一个文本文件,不要分简单的说明

    asp.net乱码解决方法

    asp.net乱码解决方法 1、从IE地址栏中直接输入这个地址,访问没错;  2、做一个静态页,其中包括这个超链接,点击访问也没错;  3、就是把这个链接添加到这个功能块中,点击访问那边接收到的是乱码。  一...

    FCKeditor 网页文本编辑器ASP.NET版

     3、加上几种我们常用的字体的方法,例如:  修改FCKConfig.FontNames = 'Arial;Comic Sans MS;Courier New;Tahoma;Times New Roman;Verdana' ;  改为:FCKConfig.FontNames = '宋体;黑体;隶书;楷体_GB2312;Arial...

    Url重写篇视频------本讲将通过实例比较ASP.NET下的三种典型URL重写方案

    但是,却无法检测非ASP.NET支持的文件扩展名的链接(我们固然可以在IIS中将所有类型的扩展名都映射到ASP.NET解析器,但是,如果我们有设置IIS的权限,为什么还要用性能更低,限制更多的ASP.NET方式的URL重写,而不...

    ASP.NET中上传下载

    ASP.NET中文件上传下载方法集合 文件的上传下载是我们在实际项目开发过程中经常需要用到的技术,这里给出几种常见的方法,本文主要内容包括:  1、如何解决文件上传大小的限制  2、以文件形式保存到服务器 ...

Global site tag (gtag.js) - Google Analytics