如何判断一个文件是否真的被下载和保存,尽管浏览器预取/缓存

How to tell if a file was really downloaded and saved, despite browser prefetch/cache?

本文关键字:保存 下载和 浏览器 预取 缓存 是否 判断 何判断 文件 一个 真的      更新时间:2023-09-26

我正在创建一个脚本来保持下载统计数据,但我只想在文件实际下载时更新统计数据。

问题是浏览器(例如,ie9, Chrome,…)在"保存/打开"对话框仍然打开时自动开始下载文件。这意味着在用户指定保存文件的位置之前,文件可以完全下载(到浏览器指定的临时目录中)(或者当Explorer仍然显示黄色警告条时)。

用户可能决定取消保存,即使文件已成功下载。如何告诉浏览器不要自动开始下载?也许是一些HTTP报头?还有其他解决方案吗?

你不能做你想做的事。这是不可能的,至少按你的要求是不可能的。

可以做的是在安装程序中放入一些代码,这些代码在服务器运行时伸出,然后您的脚本可以跟踪它。这通常是这样做的,但是肯定不是万无一失的。许多人下载软件并离线安装。(尤其是拨号上网用户,目前仍有成千上万的用户。)此外,也不能保证安装程序不会被防火墙软件或其他东西阻止。

所以这完全取决于你有多需要知道它是什么时候安装的。如果它很重要,那么安装程序需要在安装之前与服务器进行验证。当然,这可以被黑掉,而且你对此无能为力。但是,我怀疑它会达到你的目的。

另外,不要忘记每次下载要安装多次。

我想你看不出来。在发送给客户端之前,您必须让某人为软件付费。

我建议你让网站记住购买,所以如果在下载过程中出现问题,用户可以重试,而不必再次付费(或联系管理员)。

嗯,有一些中间页面来确认"是的,我想下载这个",可能会在很大程度上消除取消的下载。

现在,我不确定这是否完全可能,但是您可以尝试通过PHP提供文件,而不是从Apache下载。在PHP中,您可以使用readfile从PHP脚本中提供文件。因此,您可以调用readfile、flush并确定所服务的字节数。如果它不等于文件中的字节数,则中断。我不确定readfile是否可以这样工作,但是值得尝试一下。

注意,这仍然不能解决Marcel提到的在tempfile下载完成之前点击'Cancel'的问题。