`
shirlly
  • 浏览: 1661500 次
  • 性别: Icon_minigender_2
  • 来自: 福州
社区版块
存档分类
最新评论

ASP.NET利用HttpHandler实现多扩展名文件下载

    博客分类:
  • .NET
阅读更多
以前写过这样一篇文章(ASP.NET文件下载函数(好用的东东)),发现很多朋友询问,并且有时候会发生错误,今天我再重新更新一下,利用IHttpHandler来实现多扩展名文件下载,思路是这样:

1. 首先新建一个用于进行下载处理的page页,如download.aspx,里面什么东西也没有。

2. 添加一个DownloadHandler类,它继承于IHttpHandler接口,可以用来自定义HTTP 处理程序同步处理HTTP的请求。

public class DownloadHandler : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        HttpResponse Response = context.Response;
        HttpRequest Request = context.Request;

        System.IO.Stream iStream = null;

        byte[] buffer = new Byte[10240];

        int length;

        long dataToRead;

        try
        {
            string filename = FileHelper.Decrypt(Request["fn"]); //通过解密得到文件名

            string filepath = HttpContext.Current.Server.MapPath("~/") + "files/" + filename; //待下载的文件路径

            iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open,
                System.IO.FileAccess.Read, System.IO.FileShare.Read);
            Response.Clear();

            dataToRead = iStream.Length;

            long p = 0;
            if (Request.Headers["Range"] != null)
            {
                Response.StatusCode = 206;
                p = long.Parse(Request.Headers["Range"].Replace("bytes=", "").Replace("-", ""));
            }
            if (p != 0)
            {
                Response.AddHeader("Content-Range", "bytes " + p.ToString() + "-" + ((long)(dataToRead - 1)).ToString() + "/" + dataToRead.ToString());
            }
            Response.AddHeader("Content-Length", ((long)(dataToRead - p)).ToString());
            Response.ContentType = "application/octet-stream";
            Response.AddHeader("Content-Disposition", "attachment; filename=" + System.Web.HttpUtility.UrlEncode(System.Text.Encoding.GetEncoding(65001).GetBytes(Path.GetFileName(filename))));

            iStream.Position = p;
            dataToRead = dataToRead - p;

            while (dataToRead > 0)
            {
                if (Response.IsClientConnected)
                {
                    length = iStream.Read(buffer, 0, 10240);

                    Response.OutputStream.Write(buffer, 0, length);
                    Response.Flush();

                    buffer = new Byte[10240];
                    dataToRead = dataToRead - length;
                }
                else
                {
                    dataToRead = -1;
                }
            }
        }
        catch (Exception ex)
        {
            Response.Write("Error : " + ex.Message);
        }
        finally
        {
            if (iStream != null)
            {
                iStream.Close();
            }
            Response.End();
        }
    }

    public bool IsReusable
    {
        get { return true; }
    }
}

3. 这里涉及到一个文件名加解密的问题,是为了防止文件具体名称暴露在状态栏中,所以添加一个FileHelper类,代码如下:
public class FileHelper
{
    public static string Encrypt(string filename)
    {
        byte[] buffer = HttpContext.Current.Request.ContentEncoding.GetBytes(filename);
        return HttpUtility.UrlEncode(Convert.ToBase64String(buffer));
    }

    public static string Decrypt(string encryptfilename)
    {
        byte[] buffer = Convert.FromBase64String(encryptfilename);
        return HttpContext.Current.Request.ContentEncoding.GetString(buffer);
    }
}

利用Base64码对文件名进行加解密处理。

4. 在Web.config上,添加httpHandlers结点,如下:
<system.web>
  
  <httpHandlers>
    <add verb="*" path="download.aspx" type="DownloadHandler" />
  </httpHandlers>
</system.web>

5. 现在新建一个aspx页面,对文件进行下载:

Default.aspx代码如下:
<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>文件下载</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <asp:HyperLink ID="link" runat="server" Text="文件下载"></asp:HyperLink>
    </div>
    </form>
</body>
</html>


Default.aspx.cs代码如下:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls; 

public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        string url = FileHelper.Encrypt("DesignPattern.chm");
        link.NavigateUrl = "~/download.aspx?fn=" + url;
    }
}

这样就实现了文件下载时,不管是什么格式的文件,都能够弹出打开/保存窗口。:)

转自:http://www.cnblogs.com/liping13599168/archive/2009/02/08/1386111.html
分享到:
评论

相关推荐

    httpHandler实现.Net无后缀名Web访问

    2. **Web.Config配置文件**:这是ASP.NET应用程序的核心配置文件,用于存储整个应用的配置信息,包括应用程序的运行时设置、连接字符串、路由规则、安全设置等。 3. **IIS(Internet Information Services)**:它...

    asp.net下结合HttpHandler实现图片防盗链

    ### ASP.NET 下结合 HttpHandler 实现图片防盗链 在 Web 开发中,图片防盗链是一项重要的功能,可以有效防止其他网站未经许可直接引用本站点的图片资源,从而避免带宽和服务器资源被不当占用。ASP.NET 提供了多种...

    httphandler项目样板的压缩文件

    标签“ashx”是ASP.NET中HTTPHandler的文件扩展名,它代表了一个无固定格式的HTTPHandler处理程序。`.ashx`文件是一种文本文件,通常包含C#或VB.NET代码,用于定义和实现HTTPHandler类。当你在web.config文件中配置...

    ASP.NET架构详解

    在ASP.NET中,每个请求都可以由一个或多个HttpHandler来处理。HttpHandler实现了`IHttpHandler`接口,它包含两个方法:`ProcessRequest`和`IsReusable`。 - **HttpModule**:提供了一种在请求处理管道的不同阶段...

    ASP.NET 图片预览

    4. 实施安全措施,如检查文件类型、大小以及是否允许上传的扩展名。 5. 在图片预览后,记得清理临时文件或过期的预览图片。 综上所述,ASP.NET图片预览功能的实现涉及客户端与服务器端的交互,需要掌握HTML5的File ...

    ASP.NET实现图片防盗链功能

    这里,`path` 属性定义了要处理的文件扩展名,`verb` 属性表示所有访问方式(GET、POST 等),`type` 属性指定了处理程序的全名,包括命名空间、类名和程序集名称。 5. 运行与测试: 保存 `Web.config` 修改后,...

    asp.net中实现类似AOP功能

    通过上述方法,我们可以看到在 ASP.NET 中通过 `HttpHandler` 和 `HttpModule` 实现类似 AOP 的功能是完全可行的。这种方式不仅可以帮助开发者更好地组织代码结构,还能有效减少代码冗余,提高系统的可维护性和扩展...

    asp.net ICSharpCode.SharpZipLib.Zip 压缩

    对于"asp.net ICSharpCode.SharpZipLib.Zip 压缩"的主题,我们将探讨如何在ASP.NET应用中利用这个库进行文件的压缩操作。 首先,要在ASP.NET项目中使用ICSharpCode.SharpZipLib,你需要通过NuGet包管理器将该库添加...

    asp.net防盗链

    本文将详细介绍ASP.NET中如何利用HttpHandler实现防盗链,以确保网站资源的安全。 #### 二、理解防盗链与HttpHandler 防盗链,顾名思义,就是防止其他网站未经许可直接链接并使用本网站的资源(如图片、视频等),...

    在ASP.NET中实现Url Rewriting (六)

    对于非.aspx扩展名的URL,可能需要设置IIS的配置,或者创建对应的目录和默认文件来确保请求能被处理。不过,这种全盘交给ASP.NET处理的策略可能会带来额外的性能开销。 总的来说,ASP.NET的URL重写技术提供了丰富的...

    asp.net2.0的URL重写例子

    HttpHandler 是 ASP.NET 中处理请求的另一种方式,它可以针对特定的 URL 或扩展名进行操作。例如,你可以创建一个处理器来接收 "news/" 开头的 URL,并将其转换为实际的新闻详情页。 6. **案例分析**: 提供的链接...

    ASP.NET源码——ASP闹钟程序.zip

    开发者可能会使用HttpHandler或者Web服务(ASMX)来处理定时任务,或者利用ASP.NET的Application或Session对象存储全局状态信息。 描述中提到的"ASP闹钟程序"很可能涉及到以下几个关键知识点: 1. **ASP.NET Web ...

    一个优秀的ASP.NET(及WinForm)开发人员需要知道

    ### 优秀 ASP.NET 及 WinForm 开发人员所需掌握的核心知识点 ...通过掌握以上知识点,一个 ASP.NET 或 WinForm 开发人员不仅能够熟练地拖放控件,还能够在复杂的项目中发挥更大的作用,成为一名真正的专家级开发者。

    精通ASP.NET 2.0典型模块设计与实现 PDF

    在ASP.NET 2.0中,可以创建自定义用户控件、HttpModule和HttpHandler来实现模块化。理解这些组件的工作原理及其在应用程序中的作用,对于设计可扩展和维护性强的Web应用至关重要。 3. 控件技术:ASP.NET 2.0提供了...

    httpHandler实现.Net无后缀名Web访问的实现解析

    .NET中实现无后缀名的Web访问,实际上是指不通过传统的Web请求文件扩展名,而是利用HTTP处理程序(HttpHandler)来处理请求。这在构建RESTful服务或需要隐藏文件后缀的URL时非常有用。在.NET框架中,HttpHandler是一...

    ASP.NET生成静态页面

    在ASP.NET中,可以使用`RouteTable.Routes`进行URL重写,或者使用第三方库如`MvcRoutingShim`来实现无扩展名的URL重写。源码示例可以帮助我们更好地理解这些概念和实践。 总之,ASP.NET生成静态页面是一个涉及多...

    ASP.NET 课程设计

    5. **路由**:虽然ASP.NET 3.5不直接支持路由,但可以通过自定义HttpHandler或使用第三方库实现简单的URL重写,为Web Forms应用提供更友好的URL结构。 6. **安全性**:学习如何设置身份验证和授权,例如Windows身份...

    在asp.net中上传多个文件

    在ASP.NET中实现多文件上传是一项常见的功能,它允许用户一次性上传多个文件,极大地提高了用户体验。这个过程涉及到HTML表单、JavaScript验证、以及服务器端的处理。以下将详细讲解实现这一功能的关键步骤。 首先...

    2.ASP.NET.2.0.高级编程(第4版) [1/7]

    ASP.NET 2.0新增了50多个新服务器控件,类的数量也翻了一倍,其他许多方面也有很大的变化。本书介绍了ASP.NET 2.0中的每个新增特性和功能,以便读者把这些新技术应用于实践。.. 本书主要内容 ● 服务器控件的...

    【Asp.net上传】jQuery.Uploadify 3.2版本的一个实例

    在本文中,我们将深入探讨如何在ASP.NET环境中利用jQuery Uploadify 3.2插件实现文件上传功能。jQuery Uploadify是一款流行的JavaScript库,它提供了一种直观、用户友好的方式来处理多文件上传,适用于各种Web应用...

Global site tag (gtag.js) - Google Analytics