前段时间我写了一个关于在 Rails 应用程序中使用临时文件的问题。在特殊情况下,我决定使用tempfile
如果我还想使用该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 调用异步 - 它返回非常快,因此服务器几乎没有时间发送文件。
我现在最好的解决方案是使用非临时文件(文件而不是临时文件),然后是一个定期擦除临时文件夹的 cron 任务。这有点不雅,因为:
- 我必须使用自己的临时文件命名方案
- 文件在 tmp 文件夹中停留的时间比需要的时间长。
有更好的设置吗?或者,在 asynchronous 上是否至少有一个“成功”回调send_file
,所以我可以在完成后删除 f ?
非常感谢。