`

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 文件下载demo

    在这个"asp.net 文件下载demo"中,我们将会探讨如何在ASP.NET 3.5环境下实现安全的文件下载,同时通过文件路径的加密保护来增强安全性。 首先,让我们了解文件下载的基本流程。在ASP.NET中,你可以通过HTTP响应对象...

    基于ASP.NET文件上传、下载的网络硬盘系统 源码

    【ASP.NET文件上传与下载系统】是一个典型的Web应用程序,它允许用户通过网络进行文件的上传和下载操作。这个系统基于微软的ASP.NET框架构建,利用了ASP.NET的强大功能和高效性能,为用户提供了一种安全、便捷的方式...

    asp.net文件管理

    ASP.NET文件管理是一个高效且用户友好的在线文件管理系统,它为开发者提供了在Web环境中便捷地处理文件的能力。这个系统基于Microsoft的ASP.NET框架,利用其强大的功能和灵活性,为用户提供了一个安全、稳定且易于...

    ftp.rar_asp.net ftp_asp.net 文件_asp.net文件下载_ftp_ftp in asp.net

    标题中的“ftp.rar_asp.net ftp_asp.net 文件_asp.net文件下载_ftp_ftp in asp.net”表明这是一个关于ASP.NET中实现FTP(文件传输协议)功能的资源包,可能包含了源代码、教程或者示例。在描述中提到,“C# Asp.net ...

    asp.net 文件读写

    ### ASP.NET 文件读写操作详解 #### 一、概述 在ASP.NET开发中,文件的读写是非常常见的需求之一。无论是处理用户上传的文件、读取配置文件...希望这些内容能够帮助您更好地理解和掌握ASP.NET文件操作的相关知识。

    asp.net 导出 pdf 文件

    在 ASP.NET 中处理 PDF,通常有以下几种方法: 1. **iTextSharp**:这是一个流行的开源库,可以用于创建、编辑和读取 PDF 文件。使用 iTextSharp,我们可以创建一个新的 PDF 文档,添加文本、图像、表格等元素,...

    ASP.NET大文件上传和下载小项目

    在“ASP.NET大文件上传和下载小项目”中,我们重点关注的是如何处理大文件的上传和下载,以及涉及到的几个关键组件和技术。 1. **大文件上传**:在传统的HTTP协议中,文件上传通常受到浏览器和服务器的限制,对文件...

    asp.net Ajax 安装文件

    "表明这个安装包经过验证,确保在安装后能够正常工作,用户可以放心下载和使用,以启用ASP.NET应用程序中的AJAX功能。 在实际开发中,ASP.NET AJAX的核心组件包括以下几点: 1. **UpdatePanel**:这是ASP.NET AJAX...

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

    8. Profile:ASP.NET的Profile提供了一种方便的方式来存储和检索用户的个性化设置。在源页面设置用户配置文件的属性,然后在目标页面读取。 9. 使用自定义Control State:如果自定义控件需要在页面间保持状态,可以...

    ASP.net 文件管理

    总的来说,ASP.NET文件管理系统是一个结合了服务器端编程、文件I/O操作、用户交互以及安全控制的综合项目。开发者需要熟练掌握.NET框架,理解HTTP协议,了解文件系统和数据库操作,同时具备一定的前端开发能力,才能...

    asp.net的几种传值方式练习

    在这个"asp.net的几种传值方式练习"中,我们将探讨四种主要的数据传递方法:Session、Cookie、Application和Server.Transfer。 1. Session(会话): Session是ASP.NET中用于存储用户特定数据的重要机制。当用户...

    ASP.NET中几种有用的特效

    在这个主题“ASP.NET中几种有用的特效”中,我们将探讨如何结合ASP.NET 2.0和JQuery来实现一些常见的网页特效,提升用户的交互体验。 1. **滑动菜单**:利用JQuery的slideToggle方法,可以在用户点击时实现菜单的...

    asp.net上传模块

    ASP.NET上传模块是ASP.NET应用程序中的一个重要组成部分,它允许用户通过网页将文件上传到服务器。在Web开发中,文件上传功能常用于...理解这些核心概念和技术对于开发和维护高效、安全的ASP.NET文件上传系统至关重要。

    asp.net 实例源码

    ASP.NET 是微软公司开发的一种用于构建Web应用程序的框架,它基于.NET Framework,为开发者提供了丰富的功能和工具,简化了Web应用的开发过程。这个实例源码可能是为了展示如何使用ASP.NET来开发一个在线考试系统,...

    简单的ASP.NET文件上传类附示例程序

    ASP.NET文件上传是Web开发中常见的一种功能,用于允许用户在网页上选择并提交本地文件到服务器。在ASP.NET框架中,实现文件上传主要依赖于`HttpPostedFileBase`接口和`System.Web.UI.WebControls.FileUpload`控件。...

    asp.net 文本文件的拖放操作源码

    在ASP.NET开发中,实现文本文件的拖放操作可以极大地提升用户体验,使用户能够更加直观、便捷地上传文件。本文将详细讲解如何在ASP.NET环境中使用VB.NET编写拖放功能,特别是针对文本文件的处理。 首先,理解拖放...

    ASP.Net PDF 查看控件,完整asp.net例子

    在ASP.NET开发中,PDF查看控件是一种常用的组件,它允许用户在网页上直接预览、浏览PDF文档,而无需依赖Adobe Acrobat等第三方软件。本文将深入探讨ASP.NET PDF查看控件及其应用,以"PDFViewASP"为例,提供一个完整...

    ASP.net实现多文件上传

    ASP.NET 是微软开发的一种用于构建动态网站、web应用程序和web服务的开源框架。在这个场景中,我们关注的是如何使用ASP.NET来实现多文件上传的功能。多文件上传在现代Web应用中非常常见,例如用户可能需要上传一组...

    Asp.net Flex 文件批量上传

    在Asp.net开发中,文件批量上传是一项常见的需求,尤其在大数据时代,用户可能需要一次上传多个文件。Flex作为一款强大的富互联网应用开发框架,能够提供丰富的用户界面体验,与Asp.net结合可以构建高性能、交互性强...

Global site tag (gtag.js) - Google Analytics