如何验证下载是否已完成?

时间:2009-06-23 22:53:10

标签: asp.net-mvc

我们正在使用ASP.NET MVC,我们的行动是这样做的:

  • 从数据库中提取记录
  • 将记录标记为已下载
  • 将压缩下载推送到浏览器

现在问题出现的原因是由于某种原因下载没有完成 - 也许用户点击“取消”或IE弹出下载安全栏。我想知道是否有替代解决方案。

我们是否可以将下载内容推送给用户,然后只有在我们确定已收到正确的字节数时才将记录标记为已下载?我不得不说我正在努力解决这个问题,并且尽可能让终端用户轻松解决这个问题。

4 个答案:

答案 0 :(得分:1)

我不相信有。如果需要,您可能需要将Silverlight(或闪存)控件与您的应用程序结合使用。

基本上,任何一种方法都是打开与HTTP URL的套接字连接,并将其保存到用户驱动器上的相应路径。下载完成后,您可以让控件从文件生成哈希值并将其发送回某个ASP页面。如果哈希值从未提交或不正确,则表示他们没有完成该文件。

答案 1 :(得分:1)

您可能会尝试两件事,而不是简单地将用户重定向到要下载的资源(通过弹出您想要下载的文件)。将资源作为字节数组推出页面。下载完成后,将下载页面重定向到另一个页面。在此页面上,您可以添加到您的工作流程,询问下载是否正常。而且,如果他们达到这个目的,你可以假设(ass-u-me)它有效。要实际跟踪下载的程度,我认为这是不可行的,因为在另一端没有任何东西监视接收到的字节。

答案 2 :(得分:1)

即使检查所有字节都已发送,也无法保证:

  • 用户可能会在保存之前取消下载,或者浏览器可能会崩溃等等。
  • 收件人可能不是用户。它可能是带有病毒扫描程序的代理服务器,决定阻止传输等。

答案 3 :(得分:1)

如果没有在客户端上运行的进程可以验证传输完成,则没有任何可靠的方法可以执行此操作。当然,我们可以合理地期望用户已经拥有或愿意安装的唯一流程是 Flash

只有Flash 10支持在用户请求时将文件直接保存到磁盘。 (以前的版本有一个“共享对象”,它有点像一个非常大的cookie空间,而不是用于传输文件但保存可重用的应用程序数据)。 Read up here了解如何通过Flash 10与最终用户的文件系统进行交互。

基本上有一个方法调用save(),它会将数据推送到用户选择的位置。特定位置对您的代码隐藏;出于明显的安全原因,您只需将文件推入黑盒子,然后Flash处理其余部分。

这里缺少的唯一信息是如何将您的文件放入Flash播放器,但任何具有一点Flash经验的人都可以毫不费力地通过几分钟的研究来确定这一点。如果没有Flash经验,你仍然应该在一天内工作。