5

大きなファイルのユーザーダウンロードをWebブラウザーにトリガーする必要があります。そこで、サーバー上で転送するファイルを作成し、その後すぐに削除します。おそらくResponse.TransmitFileまたはResponse.WriteFile...を使用する必要があることを確認するのに十分な例を見つけましたが、両方に問題があると聞いています。

WriteFileは同期的ですが、ユーザーに送信する前にファイルをメモリにバッファリングします。私は非常に大きなファイルを扱っているので、これは問題を引き起こす可能性があります。

TransmitFileはローカルでバッファリングしないため、大きなファイルに対しては機能しますが、非同期であるため、TransmitFileを呼び出した後にファイルを削除できません。どうやらファイルをフラッシュしても、ファイルを削除できるとは限りませんか?

これに対処する最良の方法は何ですか?

BinaryWriteもあります...ファイルストリームをループして、セグメントにコピーできますか?

4

4 に答える 4

4

これは、TransmitFileを使用する優れたソリューションですが、デリゲートを使用して実行すると、何かを実行できるようになります。

http://improve.dk/blog/2008/03/29/response-transmitfile-close-will-kill-your-application

最後のログをファイル削除に置き換えるだけです。

于 2010-02-02T20:09:45.163 に答える
2

WriteFileは同期的ですが、ユーザーに送信する前にファイルをメモリにバッファリングします。私は非常に大きなファイルを扱っているので、これは問題を引き起こす可能性があります。

Response.BufferOutput = false;を設定することで、WriteFileへのバッファリングを無効にできると思います。

これをfalseに設定すると、バッファリングせずにWriteFileを呼び出すことができるようになります...

于 2011-03-17T08:29:11.170 に答える
0

ファイルをディスク(ランダムな名前など)にコミットして送信を開始できますが、定義した期間の後に、一時ファイル名を使用してDBテーブルにエントリを追加し、クリーンアップジョブでそれらのDBエントリを調べて、削除します。ファイルが古くなっている場合は、ディスクからファイルを取得します。

于 2010-02-02T22:44:19.770 に答える
0

WriteFileメソッドは、サーバーから小さなファイルをダウンロードするために使用されます。ファイルを転送する前に、サイズパラメータはゼロから最大Int32値の間である必要があり、ファイルをメモリにバッファリングします。TransmitFileメソッドは、サーバーから大きなファイルをダウンロードするために使用され、ファイルをメモリにバッファリングしませんが、ダウンロード中にファイルを削除しようとすると、例外がスローされます。以下は、ダウンロード後にファイルを削除するコードです。

 FileStream fs = new FileStream(@"D:\FileDownLoad\DeskTop.zip", FileMode.OpenOrCreate);
        MemoryStream ms = new MemoryStream();
        fs.CopyTo(ms);
        context.Response.AppendHeader("content-disposition", "attachment; filename=" + "DeskTop.zip");
        context.Response.ContentType = "application/octet-stream";
        context.Response.BinaryWrite(ms.ToArray());
        fs.Close();
        File.Delete(@"D:\FileDownLoad\DeskTop.zip");
于 2016-08-21T17:43:51.397 に答える