Filehandler in asp.net

谁说胖子不能爱 提交于 2019-11-27 09:38:40

Create an ASHX (faster than aspx onload event) page, pass a the id of the file as a querystring to track each download

 public class FileDownload : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
        {
            //Track your id
            string id = context.Request.QueryString["id"];
            //save into the database 
            string fileName = "YOUR-FILE.pdf";
            context.Response.Clear();
            context.Response.ContentType = "application/pdf";
            context.Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
            context.Response.TransmitFile(filePath + fileName);
            context.Response.End();
           //download the file
        }

in your html should be something like this

<a href="/GetFile.ashx?id=7" target="_blank">

or

window.location = "GetFile.ashx?id=7";

but I'd prefer to stick to the link solution.

Here is an option for a custom HttpHandler that with use a regular anchor tag to a PDF:

Create the ASHX (Right-click your project -> Add New Item -> Generic Handler)

using System.IO;
using System.Web;

namespace YourAppName
{
    public class ServePDF : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            string fileToServe = context.Request.Path;
            //Log the user and the file served to the DB
            FileInfo pdf = new FileInfo(context.Server.MapPath(fileToServe));
            context.Response.ClearContent();
            context.Response.ContentType = "application/pdf";
            context.Response.AddHeader("Content-Disposition", "attachment; filename=" + pdf.Name);
            context.Response.AddHeader("Content-Length", pdf.Length.ToString());
            context.Response.TransmitFile(pdf.FullName);
            context.Response.Flush();
            context.Response.End();
        }

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

Edit the web.config to use your Handler for all PDFs:

<httpHandlers>
    <add verb="*" path="*.pdf" type="YourAppName.ServePDF" />
</httpHandlers>

Now regular links to PDFs will use your handler to log activity and serve the file

<a href="/pdf/Newsletter01.pdf">Download This</a>
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!