在Heroku中创建临时文件

时间:2011-07-12 08:27:38

标签: ruby-on-rails heroku

我有一个托管@ ​​Heroku的应用程序。该应用程序依赖于使用套接字侦听器获取的某些提要。套接字侦听器每秒获取一行XML。一旦我检测到来自侦听器的文件信号结束,我就将文件上传到Amazon S3服务器。但是,在收到文件信号结束之前,是否可以将文件内容保存为Heroku中的临时文件?

3 个答案:

答案 0 :(得分:47)

您可以使用the #{RAILS_ROOT}/tmp/ directoryRails.root.join('tmp').to_s

  

Aspen&竹
  [...]
  有两个可写的目录:./tmp./log(在您的应用程序根目录下)   [...]

     

<强>雪松
  Cedar提供了一个短暂的可写文件系统。您可以随意写入磁盘。在dyno restart和spin-up上你的更改将会丢失。

RAILS_ROOT适用于较旧的Rails版本,Rails.root适用于较新版本。

当然,您不能依赖任何幸存的请求,也不能保证您甚至可以使用相同的dyno。

只要您处于相同的流程或请求中,Rails.root.join('tmp')就可以使用。如果您需要临时数据在请求或进程中生存,那么最好使用其他东西(例如MongoDB或PostgreSQL)作为数据通往S3的收集点。


感谢Benjamin Wheeler关于RAILS_ROOTRails.root更改的提醒。

答案 1 :(得分:15)

documentation on Heroku's read-only file system说明您可以使用#{RAILS_ROOT}/tmp但不提供任何生成临时文件名的示例。这将保证文件名的唯一性:

prefix = 'mydata'
suffix = '.xml'
Tempfile.new [prefix, suffix], "#{Rails.root}/tmp"

请注意,“无法保证此文件将在后续请求中存在(尽管可能存在),因此不应将其用于任何类型的永久存储。”

答案 2 :(得分:0)

使用更新的Heroku-16堆栈,您既可以写入根,也可以写入/tmp

尝试使用写入根目录

f = File.new("filename.txt", 'w')
f << "hi there"
f.close

Dir.entries(Dir.pwd) # see your newly created file

或与

一起/tmp
f = File.new("tmp/filename.txt", 'w')
f << "hi there"
f.close

Dir.entries(Dir.pwd.to_s + ("/tmp"))

在这两种情况下,您都会看到新文件

还尝试运行heroku restart来查看您新创建的文件消失!这是预料之中的,因为heroku存储是临时存储(在应用重新启动时将被删除)-因此,除了(非常)临时存储之外,不要依赖它