Ruby on rails 在Heroku上使用对虾

Ruby on rails 在Heroku上使用对虾,ruby-on-rails,ruby,ruby-on-rails-3,heroku,prawn,Ruby On Rails,Ruby,Ruby On Rails 3,Heroku,Prawn,我们目前正在开发一个托管在Heroku上的Rails应用程序。我们正在尝试生成PDF并将其推送到用户下载 我们正在使用对虾来处理PDF生成 我们生成PDF的代码当前为: Prawn::Document.generate @name[0]+ ".pdf" do 然后是生成文档的所有代码。不幸的是,这会将文档保存到磁盘上,这对于Heroku上托管的应用程序是不可能的(据我所知) 然后,我们使用 send_file "#{Rails.root}/"+@name[0]+ ".pdf", :type =

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

我们正在使用对虾来处理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的方法不需要将文件保存到磁盘?

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

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


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

虽然这是很久以前就回答过的,但我会为其他可能想这样做的人发帖

在当前的Prawn v0.13.2中,您还可以调用
render
,而不使用文件名。将返回一个字符串,该字符串可以通过
send\u 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。

请参阅关于使用没有文件名的prawn在内存中呈现的其他注释。我想一个挑战可能是Heroku强加的30秒请求限制。如果文件处理时间超过30秒,则应用程序可能会在500秒后失败。@tamersalama如果这是真的,那么OP的原始解决方案可能会在这个原因之前失败,因为写入和读取文件要比在内存中缓冲慢。我只是表明可以避免文件I/o。同意-只是对你的答案发表评论,因为我喜欢:)