我有一个ASP.NET应用程序,允许用户从我的Web服务器下载文件 . 我跟踪下载,只允许下载文件 .
我有以下代码为我的用户调用下载(点击按钮):
string sURL = sExternalSequenceFullPath + Session["sFilename"].ToString();
FileInfo fileInfo = new FileInfo(sURL);
Response.Clear();
Response.AddHeader("Content-Disposition", "attachment; filename=" + fileInfo.Name);
Response.AddHeader("Content-Length", fileInfo.Length.ToString());
Response.ContentType = "application/octet-stream";
Response.Flush();
Response.WriteFile(fileInfo.FullName);
我的问题是浏览器向用户提供下载(保存/保存)或取消的功能 .
有没有办法知道用户是否取消了?如果他们确实取消了,我不想计算下载对他们 .
如果没有,是否有另一种方法[没有向客户的机器添加东西] .
5 回答
我无法知道这可以做到 . 我会向用户显示一个对话框,该对话框将调用您的下载代码 . 如果他们在对话框中选择“是”,我会认为这是针对他们的 .
另一种选择是编写一个插件(Silverlight,Flash ......等),以便您拥有控制权 .
不确定它是否仍然有用,但我有相同的代码来管理下载,除了我的包装在try..catch块中,因为在我的网站的引用程序集中需要将异常抛出到我的全局错误处理程序
当用户取消下载时,我得到一个'远程主机关闭连接' . 异常,我进入我的catch区块 .
我可能会离开标记(我只编写了一年:))但也许它可能是一个简单的事情,如减少catch块中的下载计数?
您是否尝试过处理取消按钮的点击事件?
您可以使用套接字并使用HTTP协议(或FTP但仍需要使用UserName和Password访问)下载文件 . 如果您确实使用套接字,则用户将不会显示浏览器's download window. This might make users distrust your site. I don' t认为可以通过使用浏览器's download Dialog, I will keep checking on this thread however to see if it'来实现 . Check this out找一些Socket编程实例 . 祝你好运 .
Hanlet
编辑:我刚发现This检查出来,也许它可能对你有帮助 .
这个怎么样:
如果禁用响应输出缓冲,那么它将不会超过将文件发送到客户端的代码行,直到客户端完成接收,因此您可以安全地增加下一行代码中的下载计数 . 正如SamV在他的回答中所说,如果他们取消了下载,即使它中途也会抛出HttpException,因此增量下载计数代码无法运行 .
我还建议使用TransmitFile方法而不是WriteFile方法,因为它不会将整个文件加载到浪费服务器资源的内存中 .