代码改变世界

ORM映射框架总结--文件下载

2010-01-02 14:14  贺臣  阅读(928)  评论(0编辑  收藏  举报

 

本段代码提供了asp.net 中的各种文件下载方式。

 

代码
  1 /**
  2  * 日期:2009-3-13
  3  * 作者:
  4  * 功能:下载文件
  5  * */
  6 
  7 using System;
  8 using System.Configuration;
  9 using System.Data;
 10 using System.Linq;
 11 using System.Web;
 12 using System.Web.Security;
 13 using System.Web.UI;
 14 using System.Web.UI.HtmlControls;
 15 using System.Web.UI.WebControls;
 16 using System.Web.UI.WebControls.WebParts;
 17 using System.Xml.Linq;
 18 using System.Web.Services;
 19 using System.IO;
 20 using CommonData.Exceptions;
 21 
 22 namespace CommonData.DownLoad
 23 {
 24     public partial class Down
 25     {
 26 
 27         #region(下载相关属性)
 28         private string _downFilePath;
 29 
 30         /// <summary>
 31         /// 下载文件路径
 32         /// </summary>
 33         public string DownFilePath
 34         {
 35             get { return _downFilePath; }
 36             set { _downFilePath = value; }
 37         }
 38 
 39         private string _fileName;
 40 
 41         /// <summary>
 42         /// 下载的文件名称
 43         /// </summary>
 44         private string FileName
 45         {
 46             get { return this._downFilePath.Substring(this._downFilePath.LastIndexOf("\\"+ 1); }
 47             set { _fileName = value; }
 48         }
 49 
 50         private string _saveName;
 51 
 52         /// <summary>
 53         /// 下载保存文件名称
 54         /// </summary>
 55         public string SaveName
 56         {
 57             get { return _saveName; }
 58             set { _saveName = value; }
 59         }
 60         #endregion
 61 
 62         #region (构造方法)
 63         /// <summary>
 64         /// 无参数构造方法
 65         /// </summary>
 66         public Down()
 67         {
 68         }
 69 
 70         /// <summary>
 71         /// 有参数构造方法
 72         /// </summary>
 73         /// <param name="downFilePath">下载文件的物理路径</param>
 74         public Down(string downFilePath)
 75         {
 76             this._downFilePath = downFilePath;
 77         }
 78 
 79         /// <summary>
 80         /// 有参数的构造方法
 81         /// </summary>
 82         /// <param name="downFilePath">下载文件的物理路径</param>
 83         /// <param name="saveName">下载保存文件的名称</param>
 84         public Down(string downFilePath, string saveName)
 85         {
 86             this._downFilePath = downFilePath;
 87             this._saveName = saveName;
 88         }
 89         #endregion
 90 
 91 
 92 
 93         #region(TransmitFile)
 94         /// <summary>
 95         /// 下载超过400mb的文件(TransmitFile)
 96         /// </summary>
 97         /// <param name="filepath">下载文件的物理路径</param>
 98         /// <param name="saveName">下载保存的文件名称</param>
 99         /// <returns></returns>
100         public void TransmitFile(string filepath, string saveName)
101         {
102             this._downFilePath = filepath;
103             if (string.IsNullOrEmpty(saveName))
104             {
105                 this._saveName = this.FileName;
106             }
107             else
108             {
109                 this._saveName = saveName;
110             }
111             if (!string.IsNullOrEmpty(this.DownFilePath))
112             {
113                 if (File.Exists(this._downFilePath))
114                 {
115                     System.Web.HttpContext.Current.Response.ContentType = "application/octet-stream";
116                     System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition""attachment;filename=" + System.Web.HttpUtility.UrlEncode(this.SaveName, System.Text.Encoding.UTF8));
117                     System.Web.HttpContext.Current.Response.TransmitFile(this._downFilePath);
118                 }
119                 else
120                 {
121                     throw new CommonFileException("下载的文件已经被删除!");
122                 }
123             }
124             else
125             {
126                 throw new CommonFileException("未提供可供下载的文件路径");
127             }
128         }
129 
130         /// <summary>
131         /// 下载超过400mb的文件(TransmitFile)
132         /// </summary>
133         /// <param name="filepath">下载文件的物理路径</param>
134         public void TransmitFile(string filepath)
135         {
136             this.TransmitFile(filepath, "");
137         }
138 
139         /// <summary>
140         /// 下载超过400mb的文件(TransmitFile)
141         /// </summary>
142         /// <returns></returns>
143         public void TransmitFile()
144         {
145             this.TransmitFile(this._downFilePath, this.SaveName);
146         }
147         #endregion
148 
149 
150         #region(WriteFile)
151         /// <summary>
152         /// WriteFile 
153         /// </summary>
154         /// <param name="filepath">下载文件的物理路径</param>
155         /// <param name="saveName">下载保存的文件名称</param>
156         public void WriteFile(string filepath, string saveName)
157         {
158             this._downFilePath = filepath;
159             if (string.IsNullOrEmpty(saveName))
160             {
161                 this._saveName = this.FileName;
162             }
163             else
164             {
165                 this._saveName = saveName;
166             }
167             if (!string.IsNullOrEmpty(this.DownFilePath))
168             {
169                 if (File.Exists(this.DownFilePath))
170                 {
171                     FileInfo fileInfo = new FileInfo(this._downFilePath);
172                     System.Web.HttpContext.Current.Response.Clear();
173                     System.Web.HttpContext.Current.Response.ClearContent();
174                     System.Web.HttpContext.Current.Response.ClearHeaders();
175                     System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition""attachment;filename=" + HttpUtility.UrlPathEncode(this._saveName));
176                     System.Web.HttpContext.Current.Response.AddHeader("Content-Length", fileInfo.Length.ToString());
177                     System.Web.HttpContext.Current.Response.AddHeader("Content-Transfer-Encoding""binary");
178                     System.Web.HttpContext.Current.Response.ContentType = "application/octet-stream";
179                     System.Web.HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
180                     System.Web.HttpContext.Current.Response.WriteFile(fileInfo.FullName);
181                     System.Web.HttpContext.Current.Response.Flush();
182                     System.Web.HttpContext.Current.Response.End();
183                 }
184                 else
185                 {
186                     throw new CommonFileException("下载的文件已经被移除!");
187                 }
188             }
189             else
190             {
191                 throw new CommonFileException("未提供可供下载的文件路径!");
192             }
193         }
194 
195         /// <summary>
196         /// WriteFile
197         /// </summary>
198         /// <param name="filepath">下载文件的物理路径</param>
199         public void WriteFile(string filepath)
200         {
201             this.WriteFile(filepath, "");
202         }
203 
204 
205         /// <summary>
206         /// WriteFile
207         /// </summary>
208         public void WriteFile()
209         {
210             this.WriteFile(this._downFilePath, this._saveName);
211         }
212 
213         #endregion
214 
215         #region(WriteFile分块下载)
216         /// <summary>
217         /// WriteFile分块下载
218         /// </summary>
219         /// <param name="filepath">下载文件的物理路径</param>
220         /// <param name="saveName">下载保存文件的名称</param>
221         public void WriteFilePart(string filepath, string saveName)
222         {
223             this._downFilePath = filepath;
224             if (string.IsNullOrEmpty(saveName))
225             {
226                 this._saveName = this.FileName;
227             }
228             else
229             {
230                 this._saveName = saveName;
231             }
232 
233             if (!string.IsNullOrEmpty(this.DownFilePath))
234             {
235                 if (File.Exists(this.DownFilePath))
236                 {
237                     const long ChunkSize = 102400;//100K 每次读取文件,只读取100K,这样可以缓解服务器的压力 
238                     byte[] buffer = new byte[ChunkSize];
239 
240                     System.Web.HttpContext.Current.Response.Clear();
241                     FileStream iStream = File.OpenRead(this.DownFilePath);
242                     long dataLengthToRead = iStream.Length;//获取下载的文件总大小 
243                     System.Web.HttpContext.Current.Response.ContentType = "application/octet-stream";
244                     System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition""attachment; filename=" + HttpUtility.UrlEncode(this.SaveName));
245                     while (dataLengthToRead > 0 && System.Web.HttpContext.Current.Response.IsClientConnected)
246                     {
247                         int lengthRead = iStream.Read(buffer, 0, Convert.ToInt32(ChunkSize));//读取的大小 
248                         System.Web.HttpContext.Current.Response.OutputStream.Write(buffer, 0, lengthRead);
249                         System.Web.HttpContext.Current.Response.Flush();
250                         dataLengthToRead = dataLengthToRead - lengthRead;
251                     }
252                     System.Web.HttpContext.Current.Response.Close();
253 
254                 }
255                 else
256                 {
257                     throw new CommonFileException("下载的文件已经被移除!");
258                 }
259             }
260             else
261             {
262                 throw new CommonFileException("未提供可供下载的文件路径!");
263             }
264         }
265 
266         /// <summary>
267         /// WriteFile分块下载
268         /// </summary>
269         /// <param name="filepath">下载文件的物理路径</param>
270         public void WriteFilePart(string filepath)
271         {
272             this.WriteFilePart(filepath, "");
273         }
274 
275         /// <summary>
276         /// WriteFile分块下载
277         /// </summary>
278         public void WriteFilePart()
279         {
280             this.WriteFilePart(this.DownFilePath, this.SaveName);
281         }
282         #endregion
283 
284 
285         #region(以流的方式下载)
286         /// <summary>
287         /// 以流的方式下载
288         /// </summary>
289         /// <param name="filepath">下载文件的物理路径</param>
290         /// <param name="saveName">下载保存文件的名称</param>
291         public void DownStream(string filepath, string saveName)
292         {
293             this._downFilePath = filepath;
294             if (string.IsNullOrEmpty(saveName))
295             {
296                 this._saveName = this.FileName;
297             }
298             else
299             {
300                 this._saveName = saveName;
301             }
302             if (!string.IsNullOrEmpty(this.DownFilePath))
303             {
304                 if (File.Exists(this.DownFilePath))
305                 {
306                     //以字符流的形式下载文件 
307                     FileStream fs = new FileStream(this.DownFilePath, FileMode.Open);
308                     byte[] bytes = new byte[(int)fs.Length];
309                     fs.Read(bytes, 0, bytes.Length);
310                     fs.Close();
311                     System.Web.HttpContext.Current.Response.ContentType = "application/octet-stream";
312                     //通知浏览器下载文件而不是打开 
313                     System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition""attachment; filename=" + HttpUtility.UrlEncode(this.SaveName, System.Text.Encoding.UTF8));
314                     System.Web.HttpContext.Current.Response.BinaryWrite(bytes);
315                     System.Web.HttpContext.Current.Response.Flush();
316                     System.Web.HttpContext.Current.Response.End();
317                 }
318                 else
319                 {
320                     throw new CommonFileException("下载的文件已经被移除!");
321                 }
322             }
323             else
324             {
325                 throw new CommonFileException("未提供可供下载的文件路径!");
326             }
327 
328         }
329 
330         /// <summary>
331         /// 以流的方式下载
332         /// </summary>
333         /// <param name="filepath">下载文件的物理路径</param>
334         public void DownStream(string filepath)
335         {
336             this.DownStream(filepath, "");
337         }
338 
339         /// <summary>
340         /// 以流的方式下载
341         /// </summary>
342         public void DownStream()
343         {
344             this.DownStream(this.DownFilePath, this.SaveName);
345         }
346         #endregion
347 
348         #region(下载一个动态产生的文本文件)
349         /// <summary>
350         /// 下载一个动态产生的文本文件
351         /// </summary>
352         /// <param name="webForm">父页面对象</param>
353         /// <param name="saveName">下载保存文件的名称</param>
354         /// <param name="fileBody">下载文件的内容</param>
355         public void DownloadFile(System.Web.UI.Page webForm, string saveName, string fileBody)
356         {
357             this._saveName = saveName;
358             webForm.Response.ClearHeaders();
359             webForm.Response.Clear();
360             webForm.Response.Expires = 0;
361             webForm.Response.Buffer = true;
362             webForm.Response.AddHeader("Accept-Language""zh-tw");
363             //'文件名称
364             webForm.Response.AddHeader("content-disposition""attachment; filename='" + System.Web.HttpUtility.UrlEncode(this.SaveName, System.Text.Encoding.UTF8) + "'");
365             webForm.Response.ContentType = "Application/octet-stream";
366             //'文件内容
367             webForm.Response.Write(fileBody);//-----------
368             webForm.Response.End();
369         }
370         #endregion
371 
372         /// <summary>
373         /// 下载一个服务端存在文件文本文件
374         /// </summary>
375         /// <param name="webForm">父页面对象</param>
376         /// <param name="saveName">下载保存文件的名称</param>
377         /// <param name="filepath">下载文件路径</param>
378         [Obsolete]
379         private void DownloadFileByFilePath(System.Web.UI.Page webForm, string saveName, string filepath)
380         {
381             this._downFilePath = filepath;
382             if (string.IsNullOrEmpty(saveName))
383             {
384                 this._saveName = this.FileName;
385             }
386             else
387             {
388                 this._saveName = saveName;
389             }
390 
391             if (!string.IsNullOrEmpty(this.DownFilePath))
392             {
393                 if (File.Exists(this.DownFilePath))
394                 {
395                     webForm.Response.ClearHeaders();
396                     webForm.Response.Clear();
397                     webForm.Response.Expires = 0;
398                     webForm.Response.Buffer = true;
399                     webForm.Response.AddHeader("Accept-Language""zh-tw");
400                     //文件名称
401                     webForm.Response.AddHeader("content-disposition""attachment; filename=" + System.Web.HttpUtility.UrlEncode(this.SaveName, System.Text.Encoding.UTF8));
402                     webForm.Response.ContentType = "Application/octet-stream";
403                     //文件内容
404                     webForm.Response.Write(System.IO.File.ReadAllBytes(this.DownFilePath).ToString());//---------
405                     webForm.Response.End();
406                 }
407                 else
408                 {
409                     throw new CommonFileException("下载的文件已经被移除!");
410                 }
411             }
412             else
413             {
414                 throw new CommonFileException("未提供可供下载的文件路径!");
415 
416             }
417         }
418 
419     }
420 }
421 

 

 


作者:情缘
出处:http://www.cnblogs.com/qingyuan/
关于作者:从事仓库,生产软件方面的开发,在项目管理以及企业经营方面寻求发展之路
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
联系方式: 个人QQ  821865130 ; 仓储技术QQ群 88718955,142050808 ;
吉特仓储管理系统 开源地址: https://github.com/hechenqingyuan/gitwms