2

ユーザーがファイルをダウンロードできるようにする次のコードがあります。彼らがファイルを正常にダウンロードしたかどうか (可能であれば) 知る必要があります。ダウンロードに成功したかどうかを知るために関連付けることができるコールバックはありますか?

string filename = Path.GetFileName(url);
context.Response.Buffer = true;
context.Response.Charset = "";
context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
context.Response.ContentType = "application/x-rar-compressed";
context.Response.AddHeader("content-disposition", "attachment;filename=" + filename);
context.Response.TransmitFile(context.Server.MapPath(url));
context.Response.Flush();
4

3 に答える 3

4

終了したことを知らせる行をもう 1 つ追加してみませんか? context.Response.Flush() の後、実行する必要があります。

于 2009-10-06T17:24:42.110 に答える
2

次のようなことができます。


try
{
    Response.Buffer = false;
    Response.AppendHeader("Content-Disposition", "attachment;filename=" + file.Name);
    Response.AppendHeader("Content-Type", "application/octet-stream");
    Response.AppendHeader("Content-Length", file.Length.ToString());

    int offset = 0;
    byte[] buffer = new byte[64 * 1024]; // 64k chunks
    while (Response.IsClientConnected && offset < file.Length)
    {
        int readCount = file.GetBytes(buffer, offset,
            (int)Math.Min(file.Length - offset, buffer.Length));
        Response.OutputStream.Write(buffer, 0, readCount);
        offset += readCount;
    }

    if(!Response.IsClientConnected)
    {
        // Cancelled by user; do something
    }
}
catch (Exception e)
{
    throw new HttpException(500, e.Message, e);
}
finally
{
    file.Close();
}
于 2009-10-06T17:39:12.623 に答える
0

これは不可能だと思います。

応答は、IIS と対話する単なるメモリ オブジェクトです。IIS がストリーム全体の送信を終了した後、最後のバイトが到着する直前にユーザーがキャンセルする可能性があるため、ブラウザーがファイルを完全にダウンロードしたかどうかを知ることはできません。

IHttpHandler を実装し、ファイルのチャンクを Process() メソッドの context.Response に継続的に書き込み、Flush() を試して、このようにチェックすることもできます。

context.Response.Flush();
if (!context.Response.IsClientConnected)
// handle disconnect

それがあなたの問題を解決するために私が考えることができる最も近いことです。

于 2009-10-06T17:37:45.283 に答える