12

先日のスタック オーバーフローからのすばらしい助けを借りて、ダウンロード スクリプトをまとめました。ただし、ファイルがダウンロードされた後、ページをリロードして aspx ページの進行状況テンプレートを削除する必要があることがわかりました。テンプレートを削除するコードは、ダウンロード コードに追加する前に機能していました。

進捗テンプレートを削除するコード: upFinanceMasterScreen.Update();

これをリダイレクトの前後に置いて呼び出してみましたIHttpHandler

Response.Redirect("Download.ashx?ReportName=" + "RequestingTPNLeagueTable.pdf");


public class Download : IHttpHandler {

public void ProcessRequest(HttpContext context)
{    

   StringBuilder sbSavePath = new StringBuilder();
   sbSavePath.Append(DateTime.Now.Day);
   sbSavePath.Append("-");
   sbSavePath.Append(DateTime.Now.Month);
   sbSavePath.Append("-");
   sbSavePath.Append(DateTime.Now.Year);

    HttpContext.Current.Response.ClearContent();
    HttpContext.Current.Response.ContentType = "application/pdf";
    HttpResponse objResponce = context.Response;
    String test = HttpContext.Current.Request.QueryString["ReportName"];
    HttpContext.Current.Response.AppendHeader("content-disposition", "attachment; filename=" + test);
    objResponce.WriteFile(context.Server.MapPath(@"Reports\" + sbSavePath + @"\" + test));    

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

ご協力いただきありがとうございます。

4

4 に答える 4

34

ユーザーがダウンロードできるようにファイルを送り返すと、それがHTTPリクエストになります。つまり、ブラウザページを更新するポストバックを作成するかユーザーがダウンロードできるようにファイルを送信することができます。特別なトリックなしでは両方を行うことはできません。

これが、ほとんどのサイトがファイルをダウンロードするときに、最初に「ダウンロードが開始されようとしています」という新しいページに移動し、次にメタリフレッシュまたはjavascriptを使用してダウンロードするファイルに「リダイレクト」する理由です。

たとえば、ここにアクセスして.NET 4ランタイムをダウンロードすると、次のようになります。

http://www.microsoft.com/downloads/en/confirmation.aspx?FamilyID=0a391abd-25c1-4fc0-919f-b21f31ab88b7&displaylang=en&pf=true

ページをレンダリングしてから、次のmeta-refreshタグを使用して、実際にユーザーにダウンロードするファイルを提供します。

<META HTTP-EQUIV="refresh" content=".1; URL=http://download.microsoft.com/download/9/5/A/95A9616B-7A37-4AF6-BC36-D6EA96C8DAAE/dotNetFx40_Full_x86_x64.exe" />

あなたはおそらくあなたのアプリで同様のことをしなければならないでしょう。ただし、ファイルが完全にダウンロードされたで何かを行うことに本当に興味がある場合は、それをブラウザに通知するイベントがないため、運が悪いことになります。これを行う唯一の方法は、添付ファイルをアップロードするときにgmailが使用するようなAJAXアップロードです。

于 2010-10-26T15:51:37.327 に答える
10

私の場合、MVC を使用していましたが、新しいダウンロード数を表示するために、ダウンロード ボタンが選択されてから数秒後にページを更新したかっただけです。コントローラーからファイルを返していました。

これを行うには、次のスクリプトを呼び出すダウンロード ボタンに onclick イベントを追加してビューを変更しました (これもビュー内にあります)。

setTimeout(function () {
        window.location.reload(1);
    }, 5000);

それは私の目的に合っています...他の誰かに役立つことを願っています。

于 2015-06-01T19:23:34.340 に答える