zoukankan      html  css  js  c++  java
  • ASP.NET实现文件下载

    转:http://blog.csdn.net/codeshark/article/details/2473664

    方式一:TransmitFile实现下载。将指定的文件直接写入 HTTP 响应输出流,而不在内存中缓冲该文件。

     

        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=CodeShark.zip"
    );
             
    string filename = Server.MapPath("DownLoad/CodeShark.zip"
    );
             Response.TransmitFile(filename);
         }

     

    方式二:WriteFile实现下载,将指定的文件直接写入 HTTP 响应输出流。注意:对大型文件使用此方法时,调用此方法可能导致异常。可以使用此方法的文件大小取决于 Web 服务器的硬件配置。

        protected void Button2_Click(object sender, EventArgs e)
        
    {
            
    string fileName = "CodeShark.zip";//客户端保存的文件名

        string filePath = Server.MapPath("DownLoad/CodeShark.doc");//路径
        FileInfo fileInfo = new FileInfo(filePath);
            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();
        }

     

    方式三:WriteFile分块下载

        protected void Button3_Click(object sender, EventArgs e)
        
    {
            
    string fileName = "CodeShark.zip";//客户端保存的文件名
        string filePath = Server.MapPath("DownLoad/CodeShark.zip");//路径
       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 = "CodeShark.zip";//客户端保存的文件名
        string filePath = Server.MapPath("DownLoad/CodeShark.zip");//路径
        
    //以字符流的形式下载文件
        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();
        }
  • 相关阅读:
    【Java EE 学习 81】【CXF框架】【CXF整合Spring】
    【Java EE 学习 80 下】【调用WebService服务的四种方式】【WebService中的注解】
    【Java EE 学习 80 上】【WebService】
    【Java EE 学习 79 下】【动态SQL】【mybatis和spring的整合】
    【Java EE 学习 79 上】【mybatis 基本使用方法】
    【Java EE 学习 78 下】【数据采集系统第十天】【数据采集系统完成】
    【Java EE 学习 78 中】【数据采集系统第十天】【Spring远程调用】
    【Java EE 学习 78 上】【数据采集系统第十天】【Service使用Spring缓存模块】
    【Java EE 学习 77 下】【数据采集系统第九天】【使用spring实现答案水平分库】【未解决问题:分库查询问题】
    【Java EE 学习 77 上】【数据采集系统第九天】【通过AOP实现日志管理】【通过Spring石英调度动态生成日志表】【日志分表和查询】
  • 原文地址:https://www.cnblogs.com/tianma3798/p/3551799.html
Copyright © 2011-2022 走看看