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
Другие вопросы по тегам