ASP.NET通用文件下载代码(可用下载工具下载)

 

 1 
 2 /// <summary>
 3 ///DownloadHandler 的摘要说明
 4 /// </summary>
 5 public class DownloadHandler : IHttpHandler
 6 {
 7     /// <summary>
 8     ///Copyright (C) 2010 胡小军
 9     ///版权所有。 
10     ///功能说明:文件下载类--不管是什么格式的文件,都能够弹出打开/保存窗口,
11     ///包括使用下载工具下载
12     ///继承于IHttpHandler接口,可以用来自定义HTTP 处理程序同步处理HTTP的请求
13     /// </summary>
14     /// <param name="context"></param>
15     public void ProcessRequest(HttpContext context)
16     {
17         HttpResponse Response = context.Response;
18         HttpRequest Request = context.Request;
19 
20         System.IO.Stream iStream = null;
21 
22         byte[] buffer = new Byte[10240];
23 
24         int length;
25 
26         long dataToRead;
27 
28         try
29         {
30             string filename = FileHelper.Decrypt(Request["fn"]); //通过解密得到文件名
31 
32             string filepath = HttpContext.Current.Server.MapPath("~/"+ filename; //待下载的文件路径
33 
34             iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open,
35                 System.IO.FileAccess.Read, System.IO.FileShare.Read);
36             Response.Clear();
37 
38             dataToRead = iStream.Length;
39 
40             long p = 0;
41             if (Request.Headers["Range"!= null)
42             {
43                 Response.StatusCode = 206;
44                 p = long.Parse(Request.Headers["Range"].Replace("bytes=""").Replace("-"""));
45             }
46             if (p != 0)
47             {
48                 Response.AddHeader("Content-Range""bytes " + p.ToString() + "-" + ((long)(dataToRead - 1)).ToString() + "/" + dataToRead.ToString());
49             }
50             Response.AddHeader("Content-Length", ((long)(dataToRead - p)).ToString());
51             Response.ContentType = "application/octet-stream";
52             Response.AddHeader("Content-Disposition""attachment; filename=" + System.Web.HttpUtility.UrlEncode(System.Text.Encoding.GetEncoding(65001).GetBytes(Path.GetFileName(filename))));
53 
54             iStream.Position = p;
55             dataToRead = dataToRead - p;
56 
57             while (dataToRead > 0)
58             {
59                 if (Response.IsClientConnected)
60                 {
61                     length = iStream.Read(buffer, 010240);
62 
63                     Response.OutputStream.Write(buffer, 0, length);
64                     Response.Flush();
65 
66                     buffer = new Byte[10240];
67                     dataToRead = dataToRead - length;
68                 }
69                 else
70                 {
71                     dataToRead = -1;
72                 }
73             }
74         }
75         catch (Exception ex)
76         {
77             Response.Write("Error : " + ex.Message);
78         }
79         finally
80         {
81             if (iStream != null)
82             {
83                 iStream.Close();
84             }
85             Response.End();
86         }
87     }
88 
89     public bool IsReusable
90     {
91         get { return true; }
92     }
93 }
94 
95 
96 

文件名加密解密的类/方法:

 1 public class FileHelper
 2 {
 3     /// <summary>
 4     /// 利用Base64码对文件名进行加密处理。
 5     /// </summary>
 6     /// <param name="filename">文件名</param>
 7     /// <returns></returns>
 8     public static string Encrypt(string filename)
 9     {
10         byte[] buffer = HttpContext.Current.Request.ContentEncoding.GetBytes(filename);
11         return HttpUtility.UrlEncode(Convert.ToBase64String(buffer));
12     }
13 
14     /// <summary>
15     /// 利用Base64码对文件名进行解密处理。
16     /// </summary>
17     /// <param name="encryptfilename">文件名</param>
18     /// <returns></returns>
19     public static string Decrypt(string encryptfilename)
20     {
21         byte[] buffer = Convert.FromBase64String(encryptfilename);
22         return HttpContext.Current.Request.ContentEncoding.GetString(buffer);
23     }
24 }
25 

在WEB.config上添加上httpHandlers结点,代码如下:

1 <system.web>
2    <httpHandlers>
3      <add verb="*" path="download.aspx" type="DownloadHandler" />
4    </httpHandlers>
5 </system.web>
6 

现在就可以使用它了,我们在页面上放一个按钮或是链接,内容可以这样写:

1 string url = FileHelper.Encrypt("Test.txt");//文件名和路径的加密
2 link.NavigateUrl = "~/download.aspx?fn=" + url;//这就是下载链接了,你当作普通页面打开就好了
3 

 

原文地址:https://www.cnblogs.com/jasonoiu/p/1783881.html