我有以下代码,允许用户下载文件。我需要知道(如果可能的话)他们是否成功下载了文件。是否有任何类型的回调我可以联系,以了解他们是否成功下载它?感谢。
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();
答案 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
这是我能解决你问题的最接近的事情。