情况如下: 在Web应用程序中,用户选择一些选项,提交表单,PDF文件在服务器端动态生成并提供下载。
问题: 生成PDF文件需要很长时间(最多1分钟)。有些用户认为没有什么是hapening并且不断地再次点击提交按钮并再次增加服务器负载并进一步减慢它。
我想添加一些繁忙的指示器,它会显示动画图片和“请等待,你的文件正在生成”这样的消息,这看起来很容易。
但是:当文件准备好并弹出“文件下载”对话框时,如何隐藏此指示器?否则,即使用户下载了文件,该消息仍会保留在屏幕上!
似乎是非常基本的要求,但我完全陷入困境。谢谢你的任何建议!
答案 0 :(得分:5)
我必须为那些花费更长时间(转换视频格式)的事情做这件事。这对你来说似乎有些过分,但确实有效。
*我们有另一个下载脚本,使用content-disposition标题将其重命名为一个漂亮的名称(基于原始视频文件名),但这完全取决于您!
编辑:我应该添加等待页面是单击提交的结果。这是一个新的页面加载,但没有理由你不能在整个过程中使用AJAX,只要确保像其他人所说的那样,在第一次点击时禁用提交按钮以阻止用户对其进行操作。
答案 1 :(得分:2)
我同意其他受访者的意见,您最好的选择是禁用表单上的提交按钮,并给用户一个忙碌的指示;然而,对于需要很长时间才能生成文件的文件来说,为用户提供一个更实际的指示器确实是有意义的。
您可能能够实现状态栏或更新等待消息的一种方法是让客户端JavaScript对服务器进行初始调用,并让服务器在开始生成后立即响应。然后,您可以让客户端JavaScript每隔 n 秒轮询服务器,以查看文件是否完整。如果您有办法确定文件生成状态,那么您可以为进度条百分比提供数字响应,或者您可以回复“仍在工作”类型的消息。
我相信this blog on asp.net讨论了类似的设置。
答案 2 :(得分:2)
我有一篇博文,内容可能解决此问题:
这种方法涉及客户端和服务器端代码之间的一些合作。它的工作原理如下(包括代码的完整示例可以在我上面链接的博客文章中找到):
我通常以1秒的轮询间隔执行此操作,因此大多数用户必须在浏览器中显示文件下载对话框的时间与“系统忙”消息消失的时间之间等待1秒。 / p>
在我看来,这种方法非常快速且易于实施。也就是说,鉴于您的PDF生成大约需要1分钟,我认为您已经接近了“在带外”处理该处理并实现类似于接受的答案中所解释的内容的可能性。
答案 3 :(得分:1)
您可以异步轮询服务器(例如使用AJAX)来检查该特定PDF的生成是否已完成。 根据该结果或超时重新启用该按钮和/或停止动画。
答案 4 :(得分:0)
我会在onSubmit事件中添加或类似的东西。 Busy块可以只是一个在后台有ajax load动画的div。 (我确实建议使用动画gif,而不是Javascript动画。)一旦输出返回,用户将在等待一分钟后看到PDF。您甚至可以使用计时器来减少估计值(比如说60秒)并让用户知道可能需要多长时间。
document.getElementById('busy').style.display = 'block';
document.getElementById('submit').disabled = 'disabled';
繁忙的街区:
<div id="busy">
<p>Your PDF is being generated, please wait.</p>
</div>
通用CSS ......
#busy { display: none; background: url(/images/spinner.gif) no-repeat top left; padding-left: 24px; }
答案 5 :(得分:-1)
不是您问题的完整答案,但您可以在用户首次点击时停用提交按钮。
这将解决“用户不断点击从而进一步降低服务器速度”的问题。
答案 6 :(得分:-1)
感谢大家的建议。
与此同时,我尝试了另一种方法:
a)在“onclick”中,禁用“提交”按钮并显示忙碌指示符。 b)在服务器端,生成文件时,不要将其输出给用户,而是将其保存到文件系统。然后,将重定向发送到同一页面,但属性为“&amp; downloadready = true” c)在页面加载时,如果“downloadready”属性为true,则启动文件下载。
它有效,但有一个缺点:在IE中,它显示警告“为了保护您的安全,IE阻止了文件下载bla bla bla”,这对用户来说非常烦人,我想。
那么,让我们尝试一下AJAX轮询方法。