我无法获取我创建的临时文件的网址。使用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"
任何人都可以帮助我开始工作吗?感谢。
答案 0 :(得分:1)
你不能指向tmp文件夹。就这么简单。
你可以做的是
a)在公共文件夹中放置一个tmp文件夹,因为http服务器提供了公共文件
b)通过rails应用程序中的某些控制器操作来流式传输文件