Ответ 1
Я не знаю, является ли это более элегантным, но это то, что я делаю после сохранения файла.
tempfile = params[:file].tempfile.path
if File::exists?(tempfile)
File::delete(tempfile)
end
Я использую 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 для хранения. Это, похоже, не связано с проблемой, хотя - у меня была такая же проблема, когда я хранили файлы локально.
Я не знаю, является ли это более элегантным, но это то, что я делаю после сохранения файла.
tempfile = params[:file].tempfile.path
if File::exists?(tempfile)
File::delete(tempfile)
end
TempFileReaper - это промежуточное ПО стойки, которое, как считается, должно решить эту проблему.
http://www.rubydoc.info/github/rack/rack/Rack/TempfileReaper
Включение этой строки в application.rb решает проблему:
config.middleware.use Rack::TempfileReaper
ОБНОВЛЕНИЕ: проблема должна быть решена в rack-1.6.0.beta2. Я вижу, что он уже используется в Rails 4.2.0.rc2.
Ниже обходной путь служил мне хорошо почти год:
Я добавил это в конце действия контроллера, который принимает загрузки файлов:
Thread.new { GC.start }
Это вызывает сбор мусора неиспользуемых объектов Rack:: Request, которые также удаляют связанные временные файлы. Обратите внимание, что он не просматривает временный файл текущего запроса, но он удаляет предыдущие файлы и предотвращает их накопление.