Почему файлы Rackmultipart* сохраняются в моем каталоге Rails /TMP?
-
15-10-2019 - |
Вопрос
Я использую PaperClip (2.3) для обработки загрузки изображений на приложении Rails 3.0.3, работающем на Ubuntu. PaperClip обрабатывает загрузки, как рекламируется, но файлы Rackmultipart*, созданные в папке приложения /TMP, сохраняются, то есть они просто накапливаются, а не удаляют себя. Я понимаю, что мог бы использовать TMPREAPER для удаления старых TMPFILES, но я бы очень хотел найти более элегантное (и масштабируемое) решение.
У меня была предыдущая проблема с временными файлами (т.е. файлы Rackmultipart*), накапливающиеся в корневом каталоге приложения Rails (вместо /TMP). Я решил это, явно установив путь температуры в моей среде.
ENV['TMPDIR'] = Rails.root.join('tmp')
Есть ли другая переменная среды, которую необходимо установить, чтобы убедиться, что Tempfiles обрабатываются должным образом - т.е. удаляется после их сохранения в модели? Я не уверен, является ли это проблемой с настройкой скрепки или настройки рельсов.
Я искал высокий и низкий, но добился мало прогресса в этом. Я был бы благодарен за любые лидеры.
Искреннее спасибо.
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
Включая эту строку в приложении.rb решает проблему:
config.middleware.use Rack::TempfileReaper
ОБНОВЛЕНИЕ: Проблема должна быть решена в RACK-1.6.0.BETA2. Я вижу, что он уже используется в Rails 4.2.0.rc2.
Ниже обходной путь хорошо служил мне в течение почти года:
Я добавил это в конце действия контроллера, которое принимает загрузки файлов:
Thread.new { GC.start }
Это запускает сборку мусора неиспользуемых объектов Rack :: запроса, которые также удаляют связанные временные файлы. Обратите внимание, что он не поднимает временный файл Текущий Запрос, но он удаляет предыдущие файлы и не позволяет им накапливаться.