【问题标题】:Using Prawn on Heroku在 Heroku 上使用虾
【发布时间】:2012-03-29 07:19:11
【问题描述】:

我们目前正在开发托管在 Heroku 上的 Rails 应用程序。我们正在尝试生成 PDF 并将其推送给用户下载。

我们正在使用 Prawn 来处理 PDF 生成。

我们目前生成PDF的代码是:

Prawn::Document.generate @name[0]+ ".pdf" do

接下来是我们生成文档的所有代码。不幸的是,这会将文档保存到磁盘上,这对于 Heroku 上托管的应用程序来说是不可能的(据我所知)。

然后我们将其推送给用户使用

send_file "#{Rails.root}/"+@name[0]+ ".pdf", :type =>
'application/pdf',:filename => @name[0]+ ".pdf"

有没有什么办法使用Prawn直接将下载的文档推送给用户,而不需要先将文档保存到磁盘?如果没有,是否还有其他不需要在发送文件之前将文件保存到磁盘的生成 PDF 的 gem?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 heroku prawn


    【解决方案1】:

    虽然很久以前就已经回答了,但我会为可能想要这样做的其他人发帖。

    您也可以在当前 Prawn v0.13.2 中调用没有文件名的 render。将返回一个字符串,可以使用send_data 发送给客户端。模式是:

    pdf = Prawn::Document.new
    # ... calls to build the pdf
    send_data pdf.render, 
              type: 'application/pdf', 
              filename: 'download_filename.pdf',  
              disposition: :inline
    

    这将在浏览器中显示 PDF。如果您想让用户下载它,请省略 , disposition: :inline

    当然,您只希望在文档相当短或您的系统没有大量使用的情况下执行此操作,因为在用户下载完成之前它会消耗 RAM。

    【讨论】:

    • 我想一个挑战可能是 Heroku 施加的 30 秒请求限制。如果文件处理时间超过 30 秒 - 应用程序可能会以 500 秒失败。
    • @tamersalama 虽然这是真的,但在此之前,OP 的原始解决方案会因为这个原因而失败,因为写入然后读取文件比在内存中缓冲要慢。我只是表明可以避免文件 i/o。
    • 同意 - 只是在评论你的答案,因为我喜欢它 :)
    【解决方案2】:

    在 Aspen/Bamboo 上,您可以将文件保存到应用程序目录(可能是 Rails.root.join("tmp"))或任何子目录中的 tmp/ 目录中。

    在 Cedar 上,您可以将文件保存到磁盘中应用程序目录的任何位置,但无论如何您仍应选择应用程序的 tmp/ 目录的子目录。

    在任何一种情况下,保存的文件都是短暂的。它们不在应用程序的两个正在运行的实例之间共享;它们不会在重新启动之间保留;等等。不要依赖于在一个请求中保存文件,然后在第二个请求中访问它。

    【讨论】:

    • 查看其他关于使用没有文件名的虾在内存中渲染的评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 2019-05-09
    • 1970-01-01
    相关资源
    最近更新 更多