Подтвердить что ты не робот

Почему файлы RackMultipart * сохраняются в моем каталоге Rails/tmp?

Я использую Paperclip (2.3) для обработки загрузок изображений в приложении Rails 3.0.3, работающем на Ubuntu. Paperclip обрабатывает загрузки как рекламируемые, но файлы RackMultipart *, созданные в папке application/tmp, сохраняются, то есть просто накапливаются, а не удаляются. Я понимаю, что я мог бы использовать tmpreaper для удаления старых tmpfiles, но мне очень хотелось бы найти более элегантное (и масштабируемое) решение.

У меня была предыдущая проблема с временными файлами (то есть файлами RackMultipart *), накапливающимися в корневом каталоге приложения Rails (а не в /tmp ). Я решил это, явно установив путь temp в файле environment.rb следующим образом:

ENV['TMPDIR'] = Rails.root.join('tmp')

Есть ли другая переменная среды, которая должна быть настроена так, чтобы убедиться, что tempfiles обработаны правильно - то есть удалены, как только они были сохранены в модели? Я не уверен, что это проблема с установкой Paperclip или моей Rails.

Я искал высоко и низко, но не сделал этого. Я был бы признателен за любые выводы.

Искренняя благодарность.

PS - В настоящее время я использую S3 для хранения. Это, похоже, не связано с проблемой, хотя - у меня была такая же проблема, когда я хранили файлы локально.

4b9b3361

Ответ 1

Я не знаю, является ли это более элегантным, но это то, что я делаю после сохранения файла.

tempfile = params[:file].tempfile.path
if File::exists?(tempfile)
  File::delete(tempfile)
end

Ответ 2

TempFileReaper - это промежуточное ПО стойки, которое, как считается, должно решить эту проблему.

http://www.rubydoc.info/github/rack/rack/Rack/TempfileReaper

Включение этой строки в application.rb решает проблему:

config.middleware.use Rack::TempfileReaper

Ответ 3

ОБНОВЛЕНИЕ: проблема должна быть решена в rack-1.6.0.beta2. Я вижу, что он уже используется в Rails 4.2.0.rc2.

Ниже обходной путь служил мне хорошо почти год:

Я добавил это в конце действия контроллера, который принимает загрузки файлов:

Thread.new { GC.start }

Это вызывает сбор мусора неиспользуемых объектов Rack:: Request, которые также удаляют связанные временные файлы. Обратите внимание, что он не просматривает временный файл текущего запроса, но он удаляет предыдущие файлы и предотвращает их накопление.