2014-10-06 4 views
0

У меня есть контроллер с тремя действиями: index, iframe и result. Как это работает, пользователь посещает действие index через запрос GET. Это отображает представление, которое включает форму. Форма - это просто кнопка, которая отправляет POST до result. My result action просто отображает страницу, содержащую индикатор выполнения jQuery и iframe, содержание которого - это действие iframe. Действие iframe выполняет некоторую длительную обработку и в конечном итоге возвращает результат в вид result. (Вся причина, по которой мне нужно сделать это в iframe, так что действие result быстро возвращается с индикатором выполнения, поэтому пользователь не считает, что приложение разбилось.)Рельсы: передача больших объемов данных между действиями контроллера

Ранее форма состояла исключительно из кнопки, result. В этом случае действие iframe загружает файл размером 100 МБ со статического URL-адреса и выполняет некоторую обработку на нем, а затем обновляет родительскую страницу (result) с результатом обработки.

Теперь мне нужно предоставить возможность загружать файл для обработки, а не всегда использовать статический URL-адрес для загрузки. В принципе, если пользователь предоставляет файл, используйте этот файл; в противном случае используйте статический URL. Я изменил свою форму, чтобы принять загрузку файла, и эта часть работает нормально. Моя проблема заключается в том, как передать этот загруженный файл, который составляет ~ 100 МБ, от result до iframe. Это слишком много, чтобы включить сессию. Загруженный файл не нужно сохранять между прогонами.

+0

Выполняете ли вы сервер обработки или сторону клиента? –

+0

Серверная сторона. Я выяснил (временное) решение, которое должно было сохранить загруженный файл в новый файл, а затем передать местоположение вновь созданного файла в мой iframe через 'session [: something] =" /tmp/my_new_file.zip "' – user1002119

ответ

0

В дополнение к деталям реализации вы должны обновить свой вопрос немного больше фона проблемы - какие файлы вы загружаете? Какую обработку вы делаете? Какова цель системы с точки зрения конечных пользователей? Это поможет людям понять проблему, которую вы пытаетесь решить.

Я делаю некоторые предположения о цели вашей системы здесь, но вот что я хотел бы сделать:

Я бы загружать файлы и хранить их в файловой системе, а также создать новую запись в таблицу базы данных, указывающую расположение файла в системе, и «файл» обрабатывается или нет. Вы можете использовать драгоценный камень Carrier Wave для этого: https://github.com/carrierwaveuploader/carrierwave

Я бы воспользовался каким-то фоном, чтобы выполнить фактическую обработку. Таким образом, когда файл загружается, вы добавляете его в «очередь вещей, подлежащих обработке», а затем возвращаете сообщение пользователю: «задание было добавлено в очередь для обработки и скоро будет закончено». Идентификатор строки, сохраненной в таблице базы данных, может служить идентификатором, для которого необходимо обработать файл. После его обработки вы обновляете «обработанный» столбец в базе данных, который должен быть true. Есть несколько драгоценных камней на выбор, когда дело доходит до фоновых заданий - один популярный - SideKiq - http://sidekiq.org/

В этот момент это в основном зависит от того, насколько вы плавны, чтобы сделать процесс с точки зрения вашего конечного пользователя , Простейшим случаем будет:

Когда вы возвращаете сообщение «задание было добавлено в очередь для обработки и скоро будет закончено», вы также можете сказать «оно должно быть завершено в течение нескольких минут». Обновить эту страницу чтобы посмотреть, завершена ли ваша работа ». Каждое обновление, если обработка завершена, вы сообщите им об этом.

Более сложным способом было бы: после того, как будет показана страница «задание добавлена ​​в очередь», вы можете отобразить счетчик времени, как долго это было, и использовать таймер javascript для регулярного создания запросов AJAX на сервер каждые пару секунд, чтобы проверить, завершено ли задание. По завершении задания обновите страницу, чтобы указать, что, используя AJAX.

Смежные вопросы