2

私たちのプロジェクトの 1 つで、サーバーからクライアントの場所にファイルをダウンロードする機能が必要です。

このために、ashx ハンドラーを使用して操作を行います。完全に機能しており、ファイルをダウンロードできます。

ここで、ダウンロードの開始時と完了時にフィールドを更新する必要があるなどの要件が必要です。これを行う方法はありますか。

ダウンロード リンクをクリックすると、[名前を付けて保存] ダイアログ ボックスが表示され、その後、進行状況を確認するためのコントロールがないと思います。どのボタンがクリックされたかさえわからないと思います。つまり、ユーザーがクリックしたのが「はい」か「いいえ」かはわかりません。

ダウンロードがいつ開始され、いつ完了したかを知る方法を誰か提案できますか? c# で Asp.Net 2.0 を使用しています。

ダウンロードに使用されるハンドラーを以下に示します

               string fileUrl = string.Empty;

                if (context.Request["fileUrl"] != null)
                {
                    fileUrl = context.Request["fileUrl"].ToString();                    
                }
                string filename = System.IO.Path.GetFileName(fileUrl);

                context.Response.ClearContent();
                context.Response.ContentType = "application/exe";
                context.Response.AddHeader("content-disposition", String.Format("attachment; filename={0}", filename));
                context.Response.TransmitFile(fileUrl);
                context.Response.Flush(); 

ファイルは、次のようなaspxページメソッドからダウンロードされます

private void DownloadExe()
{
  string downloadUrl = "Test.exe");
  Response.Redirect("Test.ashx?fileUrl=" + downloadUrl, false);
}
4

3 に答える 3

1

ASHX ハンドラーは、ダウンロードが開始されたか (実際に呼び出されるため)、ダウンロードが完了したか (ハン​​ドラーの最後に達したか) を認識します。チャンクで手動で応答を書き込んでいる場合は、サーバー側で進行状況を取得することもできます。このようにして、ユーザーがダウンロードをキャンセルした場合 (ある時点で応答ストリームへの書き込みが失敗した場合) を検出できる場合もあります。

必要に応じて、この情報を他のページに (つまり、セッション状態を介して) 転送したり、単純にデータベースに保存したりできます。

于 2012-07-02T05:14:11.587 に答える
1

これはどう:

Response.BufferOutput = false;
Response.TransmitFile(fileUrl);
//download complete code

応答出力バッファリングを無効にすると、クライアントがファイルの受信を完了するまで、ファイルをクライアントに送信するコード行を通過しません。ダウンロードを途中でキャンセルすると、HttpException がスローされるため、ダウンロード完了コードは実行されません。

バッファをフラッシュする呼び出しの後にダウンロード完了コードを配置することもできます。ただし、大きなバイナリ ファイルを送信してサーバーのメモリを節約する場合は、バッファリングを有効にしない方がよいでしょう。

于 2012-09-18T01:51:29.990 に答える
0

OK、私は同じ問題を抱えていて、このサイトを飛び越えました: クッキーを確認してください

これは私にとってとてもうまくいきます。

于 2016-09-14T14:36:42.280 に答える