Некоторое время назад я написал вопрос относительно использование временных файлов в приложении rails. В конкретном случае я решил использовать 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 асинхронным — он возвращается очень быстро, поэтому сервер вряд ли успевает отправить файл.
Мое лучшее возможное решение на данный момент включает использование невременных файлов (файл вместо временного файла), а затем задачу cron, которая периодически стирает временную папку. Это немного неэлегантно, так как:
- Я должен использовать свою собственную схему именования временных файлов.
- Файлы остаются в папке tmp дольше, чем это необходимо.
Есть ли лучшая установка? Или есть ли хотя бы обратный вызов «успех» для асинхронного send_file
, чтобы я мог стереть f, когда это будет сделано?
Большое спасибо.