none
如何通过HttpModule拦截用户下载文件 RRS feed

  • 问题

  • 出于网站信息安全考虑,我想通过HttpModule处理当用户请求,无论是下载word附件文件还是直接点击页面中的word附件链接,都先将WORD附件文件转为PDF并打上水印,然后将转换后的PDF文件返回给用户,根据这个需求我先写了个DEMO的代码,但发现如果直接访问文件的URL地址或者下载文件是可以,但是如果在页面中点击word文件的链接地址,就直接在Office word里打开原文件内容了,不知道哪位大虾知道是什么原因,或者能给出这个需求的程序代码,DEMO程序代码如下:
    namespace ClassLibrary1
    {
        public class Class1:IHttpModule
        {
            public void Dispose()
            {
            }

            public void Init(HttpApplication context)
            {
                context.BeginRequest += new EventHandler(context_BeginRequest);
            }

            void context_BeginRequest(object sender, EventArgs e)
            {
                HttpContext context = HttpContext.Current;
                string filename = Path.GetFileName(context.Request.PhysicalPath);
                string exten = Path.GetExtension(filename);
                if (exten == ".doc")
                {
    //这里如果请求的是doc后缀名的话我把它转成txt格式文件下载,你把下面部分换成你转成pdf的代码,
    //然后下载下来。
                    FileInfo f = new FileInfo(context.Server.MapPath("TextFile.txt"));
                    context.Response.AddHeader("Content-disposition", "attachment; filename=" + HttpUtility.UrlEncode(f.Name));
                    context.Response.ContentType = "application/octet-stream";
                    context.Response.AddHeader("content-length", f.Length.ToString());
                    context.Response.WriteFile(f.FullName);
                    context.Response.End();
                }
            }
        }
    }

    2011年8月23日 12:40

答案

  • 因为直接点连接地址,这个请求iis通过扩展名发现不是由aspnet来处理,跳过了,所以你捕获不到这个请求。

     

    那么一个好的办法是在直接显示文件地址的地方,更换成某个aspx页面在加上这个文件的标识(downloadfile.aspx?fileid=123),在这个页面上再做转换和下载处理

     


    family as water
    2011年8月24日 1:23