【问题标题】:How to show a progress bar while generating a PDF file for download, without IE "download" warnings如何在生成 PDF 文件以供下载时显示进度条,而不出现 IE“下载”警告
【发布时间】:2012-05-10 14:41:33
【问题描述】:

我已经在客户端和服务器之间进行了通信。过程很简单:

  1. 我正在向在文件系统中生成 pdf 的控制器发出 AJAX POST 请求
  2. 上述请求成功后,将发出表单 GET 请求以取回 pdf,并打开标准浏览器“保存或打开”对话框

我有一个两步过程的原因是因为我需要在生成 pdf 时有一个进度条。

第二个请求是表单提交而不是 AJAX 请求的一部分的原因是因为我无法获得标准浏览器的“保存或打开”对话框。

这种方法的问题是 IE7 和 IE8 会弹出一个烦人的通知栏,通知用户下载内容很危险,我不希望这样。

所以:

  1. 我需要进度条。
  2. 如果我只处理 AJAX 请求,我需要一种方法来弹出“保存或打开”对话框。
  3. 如果我使用 GET 提交表单,我需要一种知道文件何时生成以停止进度条的方法,例如服务器和客户端之间的共享标志。

任何帮助表示赞赏。

【问题讨论】:

    标签: ajax spring post client-server download


    【解决方案1】:

    一种可能(有点反模式)的解决方法是这样,但它可能不是一个很好的设计

    但是我以前见过这个(并且承认我这样做过),除了一些内疚之外,它成功了

    • 用户单击一个链接,该链接将转到生成 PDF 的 servlet,然后等待(应应用超时设置)直到它准备好...(Content-Disposition 标头等...)就像普通的下载

    • servlet 将在生成 PDF 时报告共享会话变量的进度

    • 对服务器的 AJAX 调用将从会话变量中读取进度并向用户显示

    • PDF 完成后,浏览器只会下载它(可能存在请求超时风险)

    这里的主要问题是使用请求线程作为工作线程并阻塞它,这可能会给这个答案带来一些反对意见......

    我对消息驱动 Bean 不太熟悉,但这是另一个可能更好的解决方案。

    【讨论】:

    • 我已经想到了这个解决方案。我还设法使用 cookie 让它工作。当 pdf 准备好时,服务器会为用户的机器设置一个 cookie,并且一个 javascript 函数会每隔 500 毫秒左右检查该 cookie 是否存在并隐藏进度条。这些解决方案会起作用,但在我看来不是最干净的解决方案。
    • 非常同意,但在我看来,如果它适用于用户,我不在乎它是如何实现的(只要它没有错误,将来会坏,或者太难维护)工作软件是进度的唯一衡量标准......
    • 谢谢伊兰。将不得不做更多的研究并决定我是否采用您的会话方法。
    猜你喜欢
    • 2015-06-14
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    • 2017-11-23
    相关资源
    最近更新 更多