2013-10-01 5 views
1

Мне нужно отслеживать, когда в моем веб-приложении открывается PDF-документ. Прямо сейчас я пишу в базу данных, когда пользователь нажимает на ссылку, а затем использует window.open из кода, позади которого не является идеальным, поскольку Safari блокирует всплывающие окна и другие веб-браузеры, предупреждая, когда он работает, поэтому я думал, что Filehandler будет тем, что мне нужно использовать. Я не использовал Filehandler в прошлом, так это то, что будет работать? PDF не находится в двоичной форме, это просто статический файл, находящийся в каталоге.Filehandler in asp.net

+1

@patxy Реализация 'IHttpHandler' может и была использована для такого рода вещей, чтобы быть уверенным. –

+0

Я просто ищу способ написать в db, а затем открыть файл на другой вкладке, не используя window.open –

+0

@SamCromer, если вы не хотите создавать свой собственный HttpHandler, а затем просто измените ссылку на кнопку ссылки, выполнить код, который вам нужен для обратной передачи, и перенаправить пользователя в документ. В противном случае рассмотрим [прочитав это] (http://msdn.microsoft.com/en-us/library/ms972953.aspx). – MikeSmithDev

ответ

4

Создать 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"; 

, но я предпочел бы придерживаться ссылки.

+0

Спасибо, что я получаю, я раньше не использовал FileHandler, и мне было интересно, будет ли это работать для этой проблемы. Благодаря! –

+1

Да, этот вопрос был там некоторое время, и ashx решит вашу ситуацию очень легко. –

4

Вот вариант для пользовательского 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> 
+0

Да, я считал, что выполняю Response.Redirect, но я не хочу, чтобы они покинуть сайт. –

+0

Ну, если открытие нового окна не является вариантом, а сохранение их на одной и той же вкладке/странице не является вариантом ... что вы планировали делать? – MikeSmithDev

+0

Я думаю, что в предыдущем сообщении я упомянул, что новая вкладка - это то, что мне нужно. Response.Redirect открывается в той же вкладке/окне, которая не является опцией. «откройте файл на другой вкладке, не используя window.open» –