0

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

我已经做了所有我想的,但它不起作用。我听说 Heroku 每次启动 dynos 时都会清理一个临时目录(参见 create -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"

谁能帮我让它工作?谢谢。

4

1 回答 1

1

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

你能做的是

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

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

于 2013-10-22T19:03:38.523 回答