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, 0, 10240);
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
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, 0, 10240);
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
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
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
2 link.NavigateUrl = "~/download.aspx?fn=" + url;//这就是下载链接了,你当作普通页面打开就好了
3