0

有没有人有任何使用虾时在渲染/构建过程之前启动文件流的例子?

情况是我有一个大约 350 页的报告,在我自己的工作站上运行大约需要 60 秒,但是当将其移至生产 (EC2) 时,运行报告的时间增加了 300 多秒,当它完成时不会将 PDF 发送到浏览器。

即使 60 秒是很长的时间,没有任何用户反馈,但即使您等待 300 秒也不起作用。我一直想做的是在渲染过程之前开始文件下载(我正在使用.pdf.prawn 视图和Prawnto),这样至少用户可以在它处理时看到正在发生的事情,但是所以远已经无法做到这一点。我找到的所有示例和指南在渲染完成后开始下载,经过漫长的等待。

如果所有其他方法都失败了,我将考虑安排报告,但理想情况下,用户将能够查看报告,然后返回并进行更改并再次运行它,这显然是不允许的。

用 Prawnto 显示的代码并不多,因为它只是视图中的 PDF 布局,并在控制器中通过 this 调用。我已经尝试过 send_file,并将 PDF 布局移动到控制器以在没有 Prawnto 的情况下运行它,但所有更改似乎都给出了相同的结果 - 在漫长的等待后 PDF 被发送到浏览器。

在这一点上我没有想法,并会感激任何想法!

 respond_to do |format|
  format.pdf {
    prawnto :prawn => {:page_layout => :portrait, :skip_page_creation => true}, :inline => false
    render :layout => false
  }
4

1 回答 1

2

如果生成 PDF 需要 >60 秒,您应该考虑将其卸载到后台工作人员。建议使用 Delayed::Job 或 Resque。

让工作人员创建 PDF 并将其保存到磁盘;抛出一个标志(例如在数据库中或其他任何地方)以指示 PDF 已准备好下载。

这会给您的应用程序增加一些额外的复杂性,但用户体验会大大增强,并且您不会遇到您描述的“无法下载 PDF”问题。此外,如果您的应用程序被大量使用,您可以更轻松地将创建 PDF 的工作人员卸载到不同的服务器。

于 2011-03-23T12:38:52.343 回答