如何确定文件是否已下载

时间:2009-10-06 17:22:57

标签: c# asp.net download complete transmitfile

我有以下代码,允许用户下载文件。我需要知道(如果可能的话)他们是否成功下载了文件。是否有任何类型的回调我可以联系,以了解他们是否成功下载它?感谢。

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();

3 个答案:

答案 0 :(得分:4)

为什么不再添加一行让您知道它已完成?在context.Response.Flush()之后,应该完成它。

答案 1 :(得分: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();
}

答案 2 :(得分:0)

我想这是不可能的。

响应只是一个与IIS交互的内存对象。您无法知道浏览器是否完全下载了文件,因为用户可能会在最后一个字节到达之前取消,但是在IIS完成发送整个流之后。

你可能会尝试实现一个IHttpHandler,不断地将文件块写入Process()方法中的context.Response,以及Flush()并像这样检查

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

这是我能解决你问题的最接近的事情。