不久前,我写了关于rails应用程序中临时文件的使用的一个问题。在这种特殊情况下,我决定使用诱饵文件
如果我还想使用x-sendfile指令(作为Rails 2中的参数或Rails 3中的配置选项。),使文件发送直接由我的web服务器处理,而不是我的rails应用程序,就会产生问题。
所以我想做这样的事:
require 'tempfile'
def foo()
# creates a temporary file in tmp/
Tempfile.open('prefix', "#{Rails.root}/tmp") do |f|
f.print('a temp message')
f.flush
send_file(f.path, :x_sendfile => true) # send_file f.path in rails 3
end
end此设置有一个问题:文件在发送之前被删除!
一方面,tempfile将在Tempfile.open块结束后立即删除该文件。另一方面,x-sendfile使send_file调用异步--它返回得非常快,因此服务器几乎没有时间发送文件。
我现在最好的解决方案是使用非临时文件(File而不是Tempfile),然后使用cron任务定期删除临时文件夹。这有点不雅,因为:
有更好的安排吗?或者,在异步send_file上是否至少有一个“成功”回调,这样我就可以在它完成时擦除f?
非常感谢。
发布于 2012-07-13 21:03:33
考虑到Rails3在可用时使用x-sendfile,并且没有办法禁用它,您就不能在库(如TempFile )中使用send_file。最好的选择是我在问题中提到的一个:使用一个常规文件,并有一个cron任务,定期删除旧的临时文件。
编辑:删除未使用的文件现在更容易处理女佣宝石:
发布于 2011-05-18 12:04:24
不要阻止send_file。
f = Tempfile.new('prefix', "#{Rails.root}/tmp")
f.print('a temp message')
f.close
send_file(f.path, :x-sendfile => true)然后使用另一个脚本来清理tempfile。
发布于 2011-05-24 18:46:14
文件-temp创业板怎么样?https://github.com/djberg96/file-temp
require 'file/temp'
fh = File::Temp.new(false)
fh.puts "world"
fh.close # => Tempfile still on your filesystem就像zzzhc的回答一样,您需要从外部管理清理工作
https://stackoverflow.com/questions/6043313
复制相似问题