Rails - ActionDispatch::Http::UploadedFile в фоновом режиме
Я использую ту же идею, что и при импорте csv и excel Railscast, но поскольку стандартный код в этом эпизоде занимает некоторое время для обработки (использует ActiveRecord для создания новой записи для каждой строки в файле), я получаю тайм-ауты на Heroku и хотел бы переместить процесс импорта в фоновое задание.
Я не смог отправить файловую переменную (которая имеет тип ActionDispatch::Http::UploadedFile) в задание, поэтому вместо этого я отправил отдельные переменные file.original_filename и file.path
Сбой задания с ошибкой file /var/folders/q3/xn0bp7yd2m56_4lbq0069jj80000gn/T/RackMultipart20150319-72431-1a4pnja.xlsx does not exist
Я предполагаю, что это происходит, потому что файл уже был удален до того, как задание началось как:
Загруженные файлы - это временные файлы, срок службы которых составляет один запрос. Когда объект завершен, Ruby снимает связь с файлом, поэтому нет необходимости очищать их с помощью отдельной задачи обслуживания.
ActionDispatch::Http::UploadedFile
Может ли файл, загруженный с помощью ActionDispatch::Http::UploadedFile, не использоваться в фоновых заданиях?
Я использую Rails 4.2, ActiveJob и Resque
1 ответ
Нет, загруженный файл не может быть использован в фоновом режиме. Что вам нужно сделать, это сохранить загруженный файл в более постоянное место для обработки фоновой работы.
Вашему контроллеру понадобится что-то вроде:
file_path_to_save_to = '/path/to/file'
File.write(file_path_to_save_to, params[:uploaded_file].read)
BackgroundJob.perform_later file_path_to_save_to