Некоторое время назад я написал вопрос относительно использования временных файлов внутри приложение для рельсов. В этом конкретном случае я решил использовать tempfile
. Это вызывает проблему, если я также хочу использовать директиву x-sendfile
( в качестве параметра в Rails 2 или как параметр конфигурации в Rails 3 ), так что отправка файла обрабатывается моим веб-сервером напрямую, а не моим приложением 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, когда он ' Готово?
Большое спасибо.