zoukankan      html  css  js  c++  java
  • 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 

     

  • 相关阅读:
    Asp.Net Core Web MVC 调用Grpc,采用依赖注入
    .Net Core框架下 Grpc四种处理方法
    信息系统项目管理师高频考点(第二章)
    系统集成项目管理工程师高频考点(第二章)
    .Net Core框架下实现Grpc客户端和服务端
    .Net Framework框架下实现Grpc客户端和服务端
    Asp.Net Core Mvc项目登录IdentityServer4验证无法跳转问题
    IdentityServer4(五)
    MVC项目登录IdentityServer4报错, The cookie '.AspNetCore.Correlation has set 'SameSite=None' and must also set 'Secure'
    IdentityServer4(二)
  • 原文地址:https://www.cnblogs.com/jasonoiu/p/1783881.html
Copyright © 2011-2022 走看看