zoukankan      html  css  js  c++  java
  • asp.net文件下载

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

    //提供下载的文件,不编码的话文件名会乱码   
            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

  • 相关阅读:
    数据包构造分析工具Hping3常用命令集合大学霸IT达人
    C语言结构联合位字段知识体系总结大学霸IT达人
    基于ARP的网络扫描工具netdiscover常用命令集合
    C语言指针总结大学霸IT达人
    批量探测工具fpingping常用命令集合大学霸IT达人
    App数据分析小心预加载机制
    C语言数组知识体系整理大学霸IT达人
    ARP探测目标工具arping常用命令集合大学霸IT达人
    C语言函数知识体系大学霸IT达人
    启动sql server的服务时,window 不能在本地计算机启动Sql Server(MSSQLSERVER)问题
  • 原文地址:https://www.cnblogs.com/liufei88866/p/1766621.html
Copyright © 2011-2022 走看看