尽管浏览器预取/缓存,如何判断文件是不是真的被下载和保存?
Posted
技术标签:
【中文标题】尽管浏览器预取/缓存,如何判断文件是不是真的被下载和保存?【英文标题】:How to tell if a file was really downloaded and saved, despite browser prefetch/cache?尽管浏览器预取/缓存,如何判断文件是否真的被下载和保存? 【发布时间】:2011-08-16 21:26:53 【问题描述】:我正在创建一个脚本来保存下载统计信息,但我只想在文件被实际下载的情况下更新统计信息。
问题在于浏览器(例如 Explorer 9、Chrome 等)会在“保存/打开”对话框仍处于打开状态时自动开始下载文件。这意味着文件可以在用户指定保存位置之前完全下载(到浏览器指定的临时目录中)(或者当资源管理器仍然显示黄色警告栏时)。
即使文件已成功下载,用户也可以决定取消保存。如何告诉浏览器不要自动开始下载?也许是一些 HTTP 标头? 还有其他解决方案吗?
【问题讨论】:
您这里有问题,无论用户是否指定将文件保存在某处,都发生了实际传输,即使文件存储在临时目录中并且用户后来决定按“取消” .另外,深入了解是否有人按下“保存”按钮的目的是什么,该统计数据能告诉您什么对业务至关重要? 可能我解释的不是很好。我需要检查有多少用户下载了我们的软件(并为这些下载付费)与实际安装它的用户数量。如果用户按下下载按钮然后取消,则不应计为下载。不幸的是,由于浏览器缓存/可下载文件的预取,我不知道用户是否真的下载了该软件并且可能有一天会安装它,或者它只是浏览器机制。 那么你解决问题的方法是错误的。如果有人付费下载,他们应该能够在其许可证有效期内的任何时候下载文件,您不应该让下载链接一次有效。 迈克尔,恐怕你错过了这里的重点。用户不为下载付费,我是为完整下载付费的广告商。问题是技术问题,而不是业务问题。详情请参阅下方 Brad 的回复。 我从这里得到了一个相当有力的答案!看看这个。 http://***.com/questions/1563187/check-if-download-is-completed 【参考方案1】:嗯,有某种中间页面来确认“是的,我想下载这个”可能主要消除取消的下载。
现在,我不确定这是否完全可能,但您可以尝试通过 php 提供文件,而不是从 Apache 进行典型下载。在 PHP 中,您可以使用 readfile 从 PHP 脚本提供文件。因此,您可以调用 readfile、flush 并确定所服务的字节数。如果这不等于文件中的字节数,则它被中断。我不确定 readfile 是否可以这样工作,但值得一试。
请注意,这仍然无法解决 Marcel 提到的关于在临时文件下载完成之前点击“取消”的问题。
【讨论】:
我正在使用 PHP 和 readfile。问题是浏览器实际上在用户确认之前就在后台下载了文件,所以 PHP 认为文件已下载。有没有办法阻止浏览器进行这种后台下载,或者判断用户是否保存?【参考方案2】:你不能做你想做的事。这是不可能的,至少在你问的方式上是不可能的。
您可以做的就是在安装程序中放入一些代码,当它运行时,它会到达您的服务器,然后您的脚本可以跟踪它。这通常是这样做的,但肯定不是万无一失的。许多人下载软件并离线安装。 (尤其是拨号用户,仍然有成千上万的用户。)此外,不能保证安装程序不会被防火墙软件或其他东西阻止。
所以这一切都取决于您需要知道它何时安装。如果它很重要,那么您的安装程序需要在安装之前与服务器进行验证。当然,这可以被黑客入侵,您对此无能为力。但是,我怀疑它会为你的目的工作。
此外,不要忘记每次下载会多次安装。
【讨论】:
是的,当安装程序运行时,它会向我们的服务器发送一条消息。问题是下载的数量是我们从安装程序收到的这些消息数量的 5 倍,所以下载会在某个地方丢失。我的第一个怀疑正是我所写的问题——用户取消下载。 @Arie Livshin,... 或恢复下载,或下载管理器将文件分成几部分,或其他任何东西。 我有下载器的IP。所以在恢复下载或拆分下载的情况下,我可以看到同一个IP多次下载了文件,并且只计算了一次。 @Arie Livshin,不是真的。不要忘记许多用户可以共享同一个公共 IP。 @Arie Livshin,如果您的下载无需身份验证即可使用,请不要忘记机器人等。【参考方案3】:我认为你看不到这一点。在将软件发送给客户之前您必须让某人为该软件付费。
我建议您让网站记住购买,因此如果在下载过程中出现问题,用户可以重试,而无需再次付费(或联系管理员)。
【讨论】:
我们向广告商支付他们网站的下载次数,当用户将链接推送到我们的软件然后取消时,我们需要知道。 @Arie:你不能。在快速连接中,文件可能在用户选择“保存”或“取消”之前实际下载。 正是我的问题和我的问题。有没有办法阻止浏览器进行这种后台下载? @Arie:再说一遍:你不能。进行后台下载的不是浏览器,而是 HTTP按设计 的工作方式。发送标头后,必须立即输出文件的实际字节。以上是关于尽管浏览器预取/缓存,如何判断文件是不是真的被下载和保存?的主要内容,如果未能解决你的问题,请参考以下文章