rails - x-sendfile + временные файлы

Некоторое время назад я написал вопрос относительно использования временных файлов внутри приложение для рельсов. В этом конкретном случае я решил использовать 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, которая периодически стирает временную папку. Это немного неэлегантно, так как:

  • Мне нужно использовать свою собственную схему именования временных файлов
  • Файлы остаются в папке tmp дольше, чем они необходимы.

Есть ли лучшая настройка? Или есть ли хотя бы обратный вызов "успешного" для асинхронного send_file , чтобы я мог стереть f, когда он ' Готово?

Большое спасибо.

8
задан Community 23 May 2017 в 12:34
поделиться