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

原文地址:https://www.cnblogs.com/cancer_xu/p/1614616.html