一尘不染

检测用户何时接受下载文件

javascript

我想在用户单击允许他们下载文件的超链接后将用户重定向到其他网页。但是,由于它们需要在打开/保存文件对话框中进行选择,因此在它们接受下载之前,我不希望它们重定向。

我如何检测到他们执行了此操作?


阅读 333

收藏
2020-05-01

共1个答案

一尘不染

正如我多年维护download.js所发现的那样,根本 无法 通过JS
来告诉用户
(或可能通常参见下文),用户选择如何使用下载“打开/保存”对话框。这是一个常见的功能请求,多年来我一直在反复研究。我可以自信地说,这是不可能的。如果有人可以演示一种机械方法来确定对任何文件的提示后用户操作,我将乐意为此赏金支付10倍!

此外,这实际上不只是JS规则的问题,浏览器下载并提示此类文件的方式使问题变得更加复杂。这意味着即使服务器也无法始终告诉发生了什么。在某些特定情况下,可能会有一些特定的解决方法,但是它们并不漂亮或简单。

您可以强迫用户使用来“重新上传”下载的文件以<input type=file>进行验证,但这充其量是麻烦的,而且本地文件浏览对话框可能会有些警告。这是确保下载的唯一肯定方法,但是对于非敏感应用程序,它非常严酷,并且在某些缺少文件支持的“移动”平台上无法使用。

您也可以尝试从服务器端进行监视,向客户端推送一条消息,指出该文件已在服务器上被击中。这里的问题是,尽管在后台看不见,但一旦出现“打开/保存”对话框,下载就会立即开始下载。这就是为什么如果您稍等片刻才能“接受”大文件,那么它似乎一开始会很快下载。从服务器的角度来看,无论用户做什么,活动都是相同的。

对于巨大的文件,您可能会检测到整个文件 没有
传输,这意味着用户单击了“取消”,但这是一个复杂的同步过程,将状态从后端推到了客户端。这将需要大量的套接字自定义编程,PHP消息传递,EventSource等,以获取很少的收益。这也是一场与时间的竞赛,并且时间不确定。不建议您减慢下载速度以提高用户满意度。

如果是小文件,它将在用户甚至看不到对话框之前进行物理下载,因此服务器将无用。还要考虑到某些下载管理器扩展可以代替这项工作,并且不能保证它们的行为与普通浏览器相同。对于硬盘驱动器速度慢,需要“永远”才能“完成”下载的用户而言,强迫等待可能会很危险。我们都经历过这种情况,并且在“棘手的问题”逐渐消退时不能继续进行下去,这可能会降低用户满意度。

简而言之,除了您知道将需要很长时间才能下载的大文件以外,没有简单的方法,而且实际上也没有一般的方法。我花了很多心血和泪水试图为我的download.js用户提供此功能,但是根本没有好的选择。Ryan
dahl最初编写了node.js,因此他可以为用户提供一个上传进度条,也许有人会制作一个服务器/客户端程序包以使下载操作变得容易。

2020-05-01