我有一个托管@ Heroku的应用程序。该应用程序依赖于使用套接字侦听器获取的某些提要。套接字侦听器每秒获取一行XML。一旦我检测到来自侦听器的文件信号结束,我就将文件上传到Amazon S3服务器。但是,在收到文件信号结束之前,是否可以将文件内容保存为Heroku中的临时文件?
答案 0 :(得分:47)
您可以使用the #{RAILS_ROOT}/tmp/
directory或Rails.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_ROOT
到Rails.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存储是临时存储(在应用重新启动时将被删除)-因此,除了(非常)临时存储之外,不要依赖它