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

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

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

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

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

Я искал высоко и низко, но добился небольшого прогресса в этом. Буду благодарен за любые выводы.

Искреннее спасибо.

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

Ответы [ 3 ]

11 голосов
/ 02 июля 2015

TempFileReaper - это промежуточное программное обеспечение Rack, предназначенное для решения этой проблемы.

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

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

config.middleware.use Rack::TempfileReaper
5 голосов
/ 11 марта 2011

Я не знаю, элегантно ли это, но это то, что я делаю после сохранения файла "

tempfile = params[:file].tempfile.path
if File::exists?(tempfile)
  File::delete(tempfile)
end
0 голосов
/ 07 января 2014

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

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

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

Thread.new { GC.start }

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

...