Ruby,heroku:获取临时文件的URL(二进制)

时间:2013-10-22 17:56:14

标签: heroku ruby-on-rails-4

我无法获取我创建的临时文件的网址。使用ajax调用我的控制器的目的是在每次dynos启动时清理的临时目录中生成PDF,然后返回带有文件URL的JSON。等待JSON的JavaScript将调用window.location.href来下载PDF。

我已经完成了所有我想到的,但它无法正常工作。我听说Heroku每次启动dynos时都会清理一个临时目录(cf creating-temporary-files-in-heroku)。但那篇文章已经有2年了,而且正在谈论不再存在的RAILS_ROOT。所以我正在使用Rails.root.join('app', 'tmp')

这是我的控制器功能:

def print_a
  pdf = render_to_string :pdf => params[:name],
    :template => "prints/printA.pdf.html.erb",
    :layout => nil

  temp_dir = Rails.root.join('app','tmp')
  Dir.mkdir(temp_dir) unless Dir.exists?(temp_dir)
  @tempfile = Tempfile.new [params[:name], '.pdf'], temp_dir
  @tempurl = "#{request.protocol}#{request.host_with_port.sub(/:80$/,"")}/tmp/#{File.basename(@tempfile.path)}"
  File.open(@tempfile.path, 'wb') do |file|
      file << pdf
  end

  render "prints/printA.rabl"
end

JSON通过prints/printA.rabl呈现:

node(:tempurl) { @tempurl }
node(:tempfile) { @tempfile.path }

我正在使用tempfile来查看目录是否良好。它给出了:

/home/alain/Projects/Heroku/pj/app/tmp/_20131022-4464-alrmkb.pdf

JavaScript的重要真正价值是tempurl

http://0.0.0.0:5000/tmp/_20131022-4464-alrmkb.pdf

如果我访问此tempurl,我会收到此错误:

No route matches [GET] "/tmp/_20131022-4464-alrmkb.pdf"

任何人都可以帮助我开始工作吗?感谢。

1 个答案:

答案 0 :(得分:1)

你不能指向tmp文件夹。就这么简单。

你可以做的是

a)在公共文件夹中放置一个tmp文件夹,因为http服务器提供了公共文件

b)通过rails应用程序中的某些控制器操作来流式传输文件