有没有一种方法在JavaScript中检测下载的开始?

6
在我们当前的项目中,我们提供了一个PDF下载,用户可以通过提交的HTML表单来自定义它。动态生成PDF需要几秒钟的时间,我想通过可视化来展示这一过程,例如禁用提交按钮直到下载开始。不幸的是,我找不到检测下载开始的方法*。因此,我不知道何时重新启用提交按钮。
我已经尝试将IFrame指定为我的HTML表单的目标,希望触发onload事件。然而,它没有触发--可能是因为PDF使用“Content-disposition: attachment”头发送,并没有实际加载到IFrame中。
我目前能想到的唯一解决方案涉及在服务器上将PDF生成到临时文件中,但我想避免这种方法。
*)让我澄清一下:我不需要知道下载是否完成,甚至不需要知道它是否真正开始。我想检测浏览器询问用户是打开还是保存文件的那个点。我猜这发生在浏览器接收HTTP头时。

你想知道下载开始的时间还是完成的时间?无论哪种方式,我认为临时文件都不会有任何区别。在客户端,你无法判断文件是在服务器上存储还是实时生成的。 - Prestaul
那么您提交表单后,响应是一个PDF文件?在暂停期间,浏览器处于等待服务器响应的模式中?这是正确的吗? - Breton
@Breton: 正确! @Pretaul: 我想知道何时开始下载。因此,我可以创建一个临时文件,向隐藏的IFrame提供一些HTML响应,然后在onload处理程序中使用JavaScript获取临时文件。 - cg.
1
我知道你已经接受了一个答案,但你可能想看一下我写的关于这个问题的博客文章:http://gruffcode.com/2010/10/28/detecting-the-file-download-dialog-in-the-browser/ - Jesse Taber
@Jesse 对于这个问题使用cookies确实是一个聪明的想法!虽然对于这个案例来说大约晚了6年,但记住这个方法可能会很有用。感谢你的提醒。 - cg.
3个回答

4
如果我是你,我会使用AJAX调用向服务器发送信息,生成文件,然后将文件名/ID/其他信息返回给JavaScript,然后使window.location变成类似于download.php?id=x的形式(但是文件已经生成,因此只需设置标题并读取它)。在这一点上,您可以重新启用提交。

谢谢您的回答!您所描述的是我提到并且想要避免的“临时文件”解决方案。 - cg.
哦,非常抱歉。完全没有看到那一部分。 - Paolo Bergantino

2
您希望能够检测已下载文件的大小从0变为正值的情况。据我所知,使用JavaScript无法实现此功能 - 您需要一个能够访问客户端文件系统的插件。
建议解决方案:为每个下载创建一个会话。让客户端轮询服务器以了解下载状态。状态可能是“不存在”,“未开始”,“已开始”或“已完成”。您需要一些服务器端工作来持久化和更新下载状态,以及一个AJAX框架。

谢谢你的回答!我并不在意实际下载(到文件)的过程,只要知道何时收到HTTP响应头就足够了。我还不太确定这是否无法在JavaScript中完成。 - cg.
你提出的解决方案比我想要的要稍微复杂一些。但我猜它会起作用,而且肯定是迄今为止最好的想法。 - cg.
我仍然不太确信是否有更好的解决方案。但我现在实施了会话/状态的想法,所以我将接受这个答案。再次感谢。 - cg.
这个解决方案对小程序来说看起来最好,因为它不需要更改小程序(有时可能不可能),而且非常可靠(它将检测浏览器中的“允许Java插件”提示等情况)。但缺点是它需要额外的后端服务。 - setec

0
最简单的解决方案是估计时间(充分)并按照那种方式执行。虽然这是一个hack,但它会产生所需的效果。另一个选项可能是使用Ajax回调提交表单,并由生成器返回细节到调用页面。 http://www.jquery.com/ 可能是开始使用该选项的好地方。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接