Просто столкнулся с той же проблемой, и ответ на этот ТАК вопрос дает несколько подсказок.Самое главное:
Насколько я был в состоянии сказать или найти, нет физического файла, пока загрузка не будет прочитана.
Изначально у меня был кодстроки:
# In my controller:
Delayed::Job.enqueue(FileJob.new(params[:id], params[:upload].path))
# And In lib/file_job.rb
class FileJob < Struct.new(:file_id, :log_file)
def perform
File.open(log_file)
# Do important stuff with the incoming file.
end
end
Итак, если мы только что переместили обработку нашего файла в delayed_job, а другой запрос поступил в до , то наш delayed_job сможет выполнить и прочитать файл... Фуф, наш файл кажется уничтоженным до того, как у него появилась возможность доступа, и поэтому физический файл не создается.
Мое решение этой проблемы заключается в следующем:
# In my controller:
FileUtils.copy_entry(params[:upload].path, params[:upload].path + "B")
Delayed::Job.enqueue(FileJob.new(params[:id], params[:upload].path + "B"))
# And In lib/file_job.rb
class FileJob < Struct.new(:file_id, :log_file)
def perform
File.open(log_file)
# Do important stuff with the incoming file.
FileUtils.remove(log_file)
end
end
Я немедленно скопировал файл в контроллер, который блокирует метод от другого входящего запроса.А затем я передаю новый путь в свой delayed_job, который, наконец, должен очистить скопированный файл после того, как он завершит работу с ним.
Это исправление, похоже, работает хорошо для меня, но я думаю, что вышеприведенное решение победилоне очень хорошо работает с очень большими файлами.Я хотел бы лучше понять, что происходит с рельсами и файлами, не существующими, пока они не будут прочитаны.