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

为什么不再添加一行让您知道它已完成?在 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() 方法和 Flush() 中连续将文件的块写入 context.Response 并像这样检查

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

这是我能想到的最接近解决您问题的方法。

于 2009-10-06T17:37:45.283 回答