Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby,heroku:获取临时文件的URL(二进制)_Heroku_Ruby On Rails 4 - Fatal编程技术网

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

Ruby,heroku:获取临时文件的URL(二进制),heroku,ruby-on-rails-4,Heroku,Ruby On Rails 4,我无法获取我创建的临时文件的URL。我用ajax调用的控制器的目标是在一个临时目录中生成一个PDF,每次dynos启动时都会清理该目录,然后返回带有文件URL的JSON。等待JSON的JavaScript随后将调用window.location.href下载PDF 我想的都做了,但没用。我听说Heroku在每次启动dynos时都会清理一个临时目录(cf)。但这篇文章已经有2年历史了,它谈论的是不再存在的RAILS\u ROOT。所以我使用的是Rails.root.join('app','tmp'

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

我想的都做了,但没用。我听说Heroku在每次启动dynos时都会清理一个临时目录(cf)。但这篇文章已经有2年历史了,它谈论的是不再存在的
RAILS\u 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
我正在使用
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
,我会得到以下错误:

没有路由匹配[GET]”/tmp/_20131022-4464-alrmkb.pdf“


谁能帮我把它修好吗?谢谢。

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

你能做的就是

a) 将tmp文件夹放在公用文件夹中,因为公用文件夹由http服务器提供服务

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

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