1

Web アプリで PDF がいつ開かれたかを追跡する必要があります。現在、ユーザーがリンクをクリックしてから window.open を使用してデータベースに書き込みを行っていますが、Safari はポップアップをブロックし、他の Web ブラウザーは実行時に警告を表示するため、理想的ではありません。 Filehandler を使用する必要があります。過去にファイルハンドラーを使用したことがないので、これは機能しますか? PDFはバイナリ形式ではなく、ディレクトリにある静的ファイルです。

4

2 に答える 2

4

PDF への通常のアンカー タグを使用するカスタム HttpHandler のオプションを次に示します。

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 に答える
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 に答える