15

ユーザーがダウンロードを完了した後に何かをしたい

public class TestController : Controller
{
    public FilePathResult Index()
    {
        return File("path/to/file", "mime");
    }
}

私が試したのは、次のイベントをテストコントローラーに追加することですが、ユーザーがダウンロードを完了する前にすべてのイベントが発生します(呼び出されないデストラクタを除く)

protected override void EndExecute(IAsyncResult asyncResult)
{
    base.EndExecute(asyncResult);
}
protected override void EndExecuteCore(IAsyncResult asyncResult)
{
    base.EndExecuteCore(asyncResult);
}
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
    base.OnActionExecuted(filterContext);
}
protected override void OnResultExecuted(ResultExecutedContext filterContext)
{
    base.OnResultExecuted(filterContext);
}
protected override void Dispose(bool disposing)
{
    base.Dispose(disposing);
}
~TestController()
{
    //
}
4

5 に答える 5

3

jQueryの既製のソリューションがあります。これをチェックしてくださいhttp://johnculviner.com/jquery-file-download-plugin-for-ajax-like-feature-rich-file-downloads/
アイデアは非常に単純です:サーバー上- アクションが実行された後にカスタム Cookie を設定する属性を作成する側で、クライアント側でsetTimeoutを使用してこの Cookie をチェックし、それが来たら何かを行います。

于 2015-09-07T09:13:44.097 に答える
3

ここで説明されているように、カスタム FileStreamResult の使用を試みることができます - http://odetocode.com/blogs/scott/archive/2010/06/23/checking-client-download-success-with-asp-net-mvc.aspx

public class CheckedFileStreamResult : FileStreamResult
{
    public CheckedFileStreamResult(FileStream stream, string contentType)
        :base(stream, contentType)
    {
        DownloadCompleted = false;
    }

    public bool DownloadCompleted { get; set; }

    protected override void WriteFile(HttpResponseBase response)
    {
        var outputStream = response.OutputStream;
        using (FileStream)
        {
            var buffer = new byte[_bufferSize];
            var count = FileStream.Read(buffer, 0, _bufferSize);
            while(count != 0 && response.IsClientConnected)
            {                 
                outputStream.Write(buffer, 0, count);
                count = FileStream.Read(buffer, 0, _bufferSize);
            }
            DownloadCompleted = response.IsClientConnected;
        }
    }

    private const int _bufferSize = 0x1000;
}

ご覧のとおり、WriteFile メソッドはオーバーライドされ、カスタム ロジックが実装されて、FileStream からチャンクを読み取り、OutputStream に書き込むことによって、response.OutputStream をクライアントに提供します。このプロセスの最後に、ファイルがダウンロードされたと見なすことができます。次に、コントローラーの OnResultExecuted ハンドラーで DownloadCompleted を確認できます。または、(DownloadCompleted フラグを使用する代わりに) カスタム Action デリゲートを CheckedFileStreamResult コンストラクターに渡し、ダウンロードが完了したときにそれを呼び出すこともできます。

于 2015-09-08T20:34:34.647 に答える
0

サーバーで何かをしたい場合は、PushStreamContent を使用できます。これがstackoverflowの回答とブログエントリです。

于 2015-09-08T07:37:56.940 に答える
0

クライアント (ブラウザ) がダウンロードを行っていますが、サーバーにはダウンロードが完了したことが通知されません。HTTP では、ダウンロード後にクライアントに何か他のことをするように指示することはできません。

于 2015-09-02T10:07:16.147 に答える
0

通常、ダウンロード用と通知用の 2 つのスレッドが必要です。サーバー側では、これらのスレッドは、ファイル長から送信されたバイト数に関する情報を共有します。ダウンロード スレッドは IHttpHandler を介して作成されます。ここでは、http クエリを解析し、バイトを http 応答バッファーにバッファーごとに書き込み、共有情報を通知スレッドで更新します。通知スレッドは、ダウンロードを開始したページからの繰り返し ajax クエリです。jquery を使用して、ダウンロードの進行状況バーをレンダリングすることもできます。

于 2015-09-08T18:34:21.570 に答える