我需要跟踪在我的网络应用程序中打开 pdf 的时间。现在,当用户单击链接然后使用 window.open 后面的代码时,我正在写入数据库,这并不理想,因为 Safari 会阻止弹出窗口,而其他网络浏览器在运行时会发出警告,所以我想Filehandler 是我需要使用的。我过去没有使用过 Filehandler,所以这是可行的吗?pdf 不是二进制形式,它只是一个位于目录中的静态文件。
问问题
7589 次
2 回答
4
创建一个 ASHX(比 aspx onload 事件更快)页面,将文件的 id 作为查询字符串传递以跟踪每次下载
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
}
在你的 html 中应该是这样的
<a href="/GetFile.ashx?id=7" target="_blank">
或者
window.location = "GetFile.ashx?id=7";
但我更愿意坚持链接解决方案。
于 2013-10-01T20:16:13.647 回答
4
这是自定义 HttpHandler 的一个选项,它使用 PDF 的常规锚标记:
创建 ASHX(右键单击您的项目 -> 添加新项目 -> 通用处理程序)
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;
}
}
}
}
编辑 web.config 以将您的处理程序用于所有 PDF:
<httpHandlers>
<add verb="*" path="*.pdf" type="YourAppName.ServePDF" />
</httpHandlers>
现在,PDF 的常规链接将使用您的处理程序来记录活动并提供文件
<a href="/pdf/Newsletter01.pdf">Download This</a>
于 2013-10-01T19:54:38.110 回答