不久前,我写了一个关于在rails应用程序中使用临时文件的问题的问题。在那个特定的情况下,我决定使用tempfile。
如果我还想使用
因此,我考虑做这样的事情:
这个设置有一个问题:文件在发送之前被删除了!
一方面,`tempfile` 会在 `Tempfile.open` 块结束时立即删除文件。另一方面,`x-sendfile` 使 `send_file` 调用异步 - 它非常快地返回,因此服务器几乎没有时间发送文件。
我目前最好的解决方案涉及使用非临时文件(`File` 而不是 `Tempfile`),然后使用 cron 任务定期清除临时文件夹。这有点不优雅,因为:
- 我必须使用自己的临时文件命名方案 - 文件在 tmp 文件夹中停留的时间比需要的时间长。
是否有更好的设置?或者,至少有一个异步的 `send_file` “成功”回调,这样我就可以在完成时删除 f 吗?
非常感谢。
如果我还想使用
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 任务定期清除临时文件夹。这有点不优雅,因为:
- 我必须使用自己的临时文件命名方案 - 文件在 tmp 文件夹中停留的时间比需要的时间长。
是否有更好的设置?或者,至少有一个异步的 `send_file` “成功”回调,这样我就可以在完成时删除 f 吗?
非常感谢。