• asp.net文件下载[转]


    代码
      1 public partial class FileDownLoad : System.Web.UI.Page   
      2     {   
      3         //提供下载的文件,不编码的话文件名会乱码   
      4         private string fileName = HttpContext.Current.Server.UrlEncode("规范.rar");   
      5         private string filePath = HttpContext.Current.Server.MapPath("规范.rar");   
      6         //使用TransmifFile下载文件   
      7         protected void btnDL1_Click(object sender, EventArgs e)   
      8         {   
      9             FileInfo info = new FileInfo(filePath);   
     10             long fileSize = info.Length;   
     11             Response.Clear();   
     12             Response.ContentType = "application/x-zip-compressed";   
     13             Response.AddHeader("Content-Disposition""attachment;filename="+ fileName);   
     14             //不指明Content-Length用Flush的话不会显示下载进度   
     15             Response.AddHeader("Content-Length", fileSize.ToString());   
     16             Response.TransmitFile(filePath, 0, fileSize);   
     17             Response.Flush();   
     18             Response.Close();   
     19         }   
     20   
     21         //使用WriteFile下载文件   
     22         protected void btnDL2_Click(object sender, EventArgs e)   
     23         {   
     24             FileInfo info = new FileInfo(filePath);   
     25             long fileSize = info.Length;   
     26             Response.Clear();   
     27             Response.ContentType = "application/octet-stream";   
     28             Response.AddHeader("Content-Disposition""attachement;filename=" + fileName);   
     29             //指定文件大小   
     30             Response.AddHeader("Content-Length", fileSize.ToString());   
     31             Response.WriteFile(filePath, 0, fileSize);   
     32             Response.Flush();   
     33             Response.Close();   
     34         }   
     35   
     36         //使用OutputStream.Write分块下载文件   
     37         protected void btnDL3_Click(object sender, EventArgs e)   
     38         {   
     39             //指定块大小   
     40             long chunkSize = 102400;   
     41             //建立一个100K的缓冲区   
     42             byte[] buffer = new byte[chunkSize];   
     43             //已读的字节数   
     44             long dataToRead = 0;   
     45             FileStream stream = null;   
     46             try    
     47             {   
     48                 //打开文件   
     49                 stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);   
     50                 dataToRead = stream.Length;   
     51   
     52                 //添加Http头   
     53                 Response.ContentType = "application/octet-stream";   
     54                 Response.AddHeader("Content-Disposition""attachement;filename=" + fileName);   
     55                 Response.AddHeader("Content-Length", dataToRead.ToString());   
     56   
     57                 while (dataToRead > 0)    
     58                 {   
     59                     if (Response.IsClientConnected)   
     60                     {   
     61                         int length = stream.Read(buffer, 0, Convert.ToInt32(chunkSize));   
     62                         Response.OutputStream.Write(buffer, 0, length);   
     63                         Response.Flush();   
     64                         Response.Clear();   
     65                         dataToRead -= length;   
     66                     }   
     67                     else    
     68                     {   
     69                         //防止client失去连接   
     70                         dataToRead = -1;   
     71                     }   
     72                 }   
     73             }   
     74             catch (Exception ex)   
     75             {   
     76                 Response.Write("Error:" + ex.Message);   
     77             }   
     78             finally    
     79             {   
     80                 if (stream != null)    
     81                 {   
     82                     stream.Close();   
     83                 }   
     84                 Response.Close();   
     85             }   
     86         }   
     87   
     88         //使用BinaryWrite下载文件,大文件效率不行   
     89         protected void btnDL4_Click(object sender, EventArgs e)   
     90         {   
     91             FileStream stream = null;   
     92             try    
     93             {   
     94                 //读文件,大文件一次读入会占用大量内存   
     95                 stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);   
     96                 byte[] bytes = new byte[stream.Length];   
     97                 stream.Read(bytes, 0, bytes.Length);   
     98                 stream.Close();   
     99   
    100                 //添加Http头   
    101                 Response.ContentType = "application/octet-stream";   
    102                 Response.AddHeader("Content-Disposition""attachement;filename=" + fileName);   
    103                 Response.AddHeader("Content-Length", bytes.Length.ToString());   
    104                 Response.BinaryWrite(bytes);   
    105                 Response.Flush();   
    106             }   
    107             catch (Exception ex)   
    108             {   
    109                 Response.Write("Error:" + ex.Message);   
    110             }   
    111             finally    
    112             {   
    113                 if (stream != null)    
    114                 {   
    115                     stream.Close();   
    116                 }   
    117                 Response.Close();   
    118             }   
    119         }   
    120         //使用BinaryWrite分块下载文件   
    121         protected void btnDL5_Click(object sender, EventArgs e)   
    122         {   
    123             //指定区块和缓冲区   
    124             long chunkSize = 102400;   
    125             byte[] buffer = new byte[chunkSize];   
    126             FileStream stream = null;   
    127             long dataToRead = 0;   
    128             try    
    129             {   
    130                 stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);   
    131                 dataToRead = stream.Length;   
    132                 //添加Http头   
    133                 Response.ContentType = "application/octet-stream";   
    134                 Response.AddHeader("Content-Disposition""attachement;filename=" + fileName);   
    135                 Response.AddHeader("Content-Length", dataToRead.ToString());   
    136   
    137                 while (dataToRead > 0)    
    138                 {   
    139                     if (Response.IsClientConnected)   
    140                     {   
    141                         int length = stream.Read(buffer, 0, Convert.ToInt32(chunkSize));   
    142                         Response.BinaryWrite(buffer);   
    143                         Response.Flush();   
    144                         Response.Clear();   
    145   
    146                         dataToRead -= length;   
    147                     }   
    148                     else    
    149                     {   
    150                         dataToRead = -1;   
    151                     }   
    152                 }   
    153   
    154             }   
    155             catch(Exception ex)   
    156             {   
    157                 Response.Write("Error:" + ex.Message);   
    158             }   
    159             finally  
    160             {   
    161                 if (stream != null)    
    162                 {   
    163                     stream.Close();   
    164                 }   
    165                 Response.Close();   
    166             }   
    167         }   
    168     }  
    169 

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

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


    转自CSDN博客:http://blog.csdn.net/zabcd117/archive/2009/04/24/4107033.aspx

  • 相关阅读:
    浅谈软件测试流程
    在9个点上画10条直线,要求每条直线上至少有三个点
    word中快速插入时间
    多核处理器时,__rdtsc()的使用编程珠玑第一章
    解决 error LNK2019: 无法解析的外部符号 问题
    修改IE代理
    overload重载 override覆盖 overwirte重写
    几个题目
    12个球一个天平,现知道只有一个和其它的重量不同,问怎样称才能用三次就找到那个球。
    在link.c中已经include了头文件了,为什么使用ld还无法识别mian和printf?
  • 原文地址:https://www.cnblogs.com/cancer_xu/p/1614616.html
Copyright © 2020-2023  润新知