如果你就是站点上的一个静态文件,不经过你的代码,那是很难检测的。如果用户请求的一个地址,经过你的代码,然后你再将文件数据流写入response的的数据流里,这样的做法是可以检测到的。代码类似这样:
var buffer = new byte[10240];
var succeed = true;
using (FileStream fs = FileManager.LoadFile(id))
{
var lengthRead = 0;
while ((lengthRead = fs.Read(buffer, 0, buffer.Length)) > 0)
{
if (!response.IsClientConnected)
{
succeed = false;
break;
}
response.OutputStream.Write(buffer, 0, lengthRead);
response.Flush();
}
}
if (succeed)
{
//成功下载了
}
FileManager.Load(id)是根据id获取到对应文件的FileStream,不是framework的方法你别弄混了。用户请求的url大概是http://files.mysite.com/12345,其中12345是文件的id。如果用户下载的文件是类似这样的:http://www.mysite.com/client.exe,其中client.exe是你站点的一个静态文件,这样是很难检测到下载成功的。
如上图:这样是不行的,当我点击取消,他还是视为已下载成功了!
@曲达子: 我只是提供给你一个思路,很多细节是要你自己修改的。比如刚才我贴的代码可以大概这样修改:默认succeed是false,每次写入一定的字节数,就累加,最后判断是否写入的总字节数等于文件大小,等于的话才认为是成功。
@水牛刀刀: 我知道 ,你的是否下载成功是以Response.IsClientConnected为判断条件,但是这明显是不行的。
@曲达子: 那是最开始的代码啊,我上面的回复不是说了吗,以最终写入字节数是否与文件大小相等为条件。
以前客户提了一个相同的需求,我们直接否了。只要弹出了保存,我们就认为一次成功的下载。
看来还是没有解决方案啊~