Мне нужно отслеживать, когда в моем веб-приложении открывается PDF-документ. Прямо сейчас я пишу в базу данных, когда пользователь нажимает на ссылку, а затем использует window.open из кода, позади которого не является идеальным, поскольку Safari блокирует всплывающие окна и другие веб-браузеры, предупреждая, когда он работает, поэтому я думал, что Filehandler будет тем, что мне нужно использовать. Я не использовал Filehandler в прошлом, так это то, что будет работать? PDF не находится в двоичной форме, это просто статический файл, находящийся в каталоге.Filehandler in asp.net
ответ
Создать ASHx (быстрее, чем ASPX OnLoad событие) страницу, передать идентификатор файла в строку запроса для отслеживания каждой загрузки
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";
, но я предпочел бы придерживаться ссылки.
Спасибо, что я получаю, я раньше не использовал FileHandler, и мне было интересно, будет ли это работать для этой проблемы. Благодаря! –
Да, этот вопрос был там некоторое время, и ashx решит вашу ситуацию очень легко. –
Вот вариант для пользовательского HttpHandler, что с помощью регулярного тега привязки к PDF:
Создать ASHx (правой кнопкой мыши проект -> Добавить новый элемент -> 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;
}
}
}
}
Отредактируйте web.config использовать обработчик для всех PDF-файлов:
<httpHandlers>
<add verb="*" path="*.pdf" type="YourAppName.ServePDF" />
</httpHandlers>
Теперь регулярные ссылки на PDF-файлы будут использовать обработчик для регистрации активности и служит файл
<a href="/pdf/Newsletter01.pdf">Download This</a>
Да, я считал, что выполняю Response.Redirect, но я не хочу, чтобы они покинуть сайт. –
Ну, если открытие нового окна не является вариантом, а сохранение их на одной и той же вкладке/странице не является вариантом ... что вы планировали делать? – MikeSmithDev
Я думаю, что в предыдущем сообщении я упомянул, что новая вкладка - это то, что мне нужно. Response.Redirect открывается в той же вкладке/окне, которая не является опцией. «откройте файл на другой вкладке, не используя window.open» –
@patxy Реализация 'IHttpHandler' может и была использована для такого рода вещей, чтобы быть уверенным. –
Я просто ищу способ написать в db, а затем открыть файл на другой вкладке, не используя window.open –
@SamCromer, если вы не хотите создавать свой собственный HttpHandler, а затем просто измените ссылку на кнопку ссылки, выполнить код, который вам нужен для обратной передачи, и перенаправить пользователя в документ. В противном случае рассмотрим [прочитав это] (http://msdn.microsoft.com/en-us/library/ms972953.aspx). – MikeSmithDev