12

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

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

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

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

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

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

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

+0

Сейчас я обработка вопроса TempFile используя хроны и tmpreaper. CRON запускает tmpreaper каждые 10 минут, чтобы очистить каталог tmp. По-прежнему хотелось бы более элегантное решение, но сейчас это работает. – NAD

+0

Какой сервер вы используете? Возможно, Пума? –

+0

Соответствующая тема в группе Rack devel: https://groups.google.com/forum/#!searchin/rack-devel/temp/rack-devel/brK8eh-MByw/sw61oJJCGRMJ –

ответ

5

Я не знаю, если это больше элегантное, но это то, что я делаю после того, как файл будет сохранен»

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

Я вижу * два идентичных * временных файлы, созданные выше, удалят только один из них (https://github.com/rack/rack/issues/641). –

0

UPDATE:. Проблема должна быть решена в стойке-1.6.0.beta2 I видеть, что это уже используется в Rails 4.2.0.rc2

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

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

Thread.new { GC.start } 

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

9

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

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

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

config.middleware.use Rack::TempfileReaper 
+1

u сохранил мою жизнь. –

+1

Это правильный ответ, так как эти временные файлы являются областью Rack (очевидно, из их имени файла).Это происходит для любой формы multipart upload, а не только при использовании Paperclip. Средство промежуточного программного обеспечения TempfileReaper было добавлено в Rack в версии 1.6.0, но, по-видимому, оно не включено Rails по умолчанию. – CMcClymont