Что такое способ сохранения изображений в Ruby on Rails?

9

Я занимаюсь разработкой на iOS и переключаюсь с PHP- бэкенда на Ruby on Rails. Формат обмена JSON .

Быстрый поиск в Google для «сохранения изображений в Rails» приводит почти к каждому результату, говорящему о сохранении данных изображений в виде больших двоичных объектов в базе данных. Я могу ошибаться, но у меня сложилось впечатление, что сохранение данных изображения в базе данных - это огромная трата времени и места (в отличие от сохранения ссылки на местоположение файла ('/img/subcat/4656.png') ,

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

пользователь
источник
1
Я наткнулся на PaperClip , который, кажется, довольно близко к тому, что я хочу. Буду признателен совет опытных людей из Rails о том, как справляться с обслуживанием и получением тысяч изображений с оптимальной скоростью.
пользователь
1
Вы знаете, что образ займет столько же места на БД или на диске, верно? Я бы сказал, что Rails хранит базу данных, потому что она не использует Apache так сильно, как PHP для обработки кэширования. Это может быть совершенно неправильно, хотя.
Флориан Маргэйн
2
Да, я не думаю, что данные изображения будут управляться местом хранения. Rails могут отличаться, но некоторые заслуживающие доверия члены SO, похоже, склоняются к пути к файлам в базе данных. Кроме того, я думаю, что общеизвестно, что базы данных трудно масштабировать, поэтому хранение тонны данных изображений в базе данных, безусловно, не облегчит эту задачу.
пользователь

Ответы:

4

В прошлом я использовал PaperClip с Amazon S3 и CloudFront CDN для более быстрой доставки. PaperClip прекрасно поддерживает встроенное хранилище S3: см. Их документацию по параметрам конфигурации хранилища S3 .

  1. Настройте дистрибутив CloudFront для пересылки запросов изображений в корзину S3 и других запросов статических ресурсов в приложение Ruby on Rails (в качестве альтернативы вы также можете загрузить их в S3, но это выходит за рамки этого вопроса).
  2. CNAME домен, которым вы управляете (например, assets.example.com), чтобы указать на ваш дистрибутив CloudFront.
  3. В конфигурации PaperClip установите s3_host_alias: assets.example.com. Это приведет к тому, что сгенерированные URL-адреса к сохраненным ресурсам изображений будут использоваться вашим хостом распространения CloudFront.
  4. В вашей конфигурации Ruby on Rails вы можете сделать это config.action_controller.asset_host = http://assets.example.com. URL-адреса ресурсов Ruby on Rails также будут использовать ваш дистрибутив CloudFront для кэширования / ускорения доставки.

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

(В качестве возможного продвинутого шага, который может и не понадобиться или не пригодиться для вашего случая, вы также можете настроить несколько CNAME для своего дистрибутива CloudFront, например, assets0.example.comи assets1.example.com. Обе скрепки s3_host_aliasи action_controller.asset_hostзатем могут принимать лямбды, которые позволят вам детерминистически (на основе asset) генерировать URL-адреса, использующие разные хосты, для лучшего распараллеливания, если вы загружаете их на одной странице, так как браузеры ограничивают максимальное количество одновременных подключений к одному хосту.)

gregates
источник
3

Я пробовал несколько драгоценных камней, но теперь я использую FineUploader вместе с PaperClip

FineUploader обрабатывает большую часть графического интерфейса для вас, например, процесс загрузки, перетаскивание и несколько загрузок файлов и так далее. Я использую PaperClip, потому что я хочу хранить изображения на своих серверах, а не на S3.

Что мы обычно делаем, так это ищем стабильное готовое к конфигурированию решение вместо воссоздания материала с нуля. С помощью PaperClip я сохраняю изображения, а с помощью StateMachine я делаю преобразования для изображений и помещаю их в категорию на основе имени файла. У меня был тот же вопрос, что и у вас, и это было мое лучшее рабочее решение, поэтому я делюсь им.

JeroenKnoops
источник
2
Это всего лишь рекомендация для внешнего пакета, чтобы сделать работу; OP спрашивал, что обычно делают разработчики Ruby on Rails для хранения изображений, а не рекомендации. Хотя это может быть примером того, как это делает один пакет, на самом деле это не отвечает на вопрос.
Мартейн Питерс
Правда. Что мы обычно делаем, так это ищем стабильное готовое к конфигурированию решение вместо воссоздания материала с нуля. С помощью PaperClip я сохраняю изображения, а с помощью StateMachine я делаю преобразования для изображений и помещаю их в категорию на основе имени файла. У меня был тот же вопрос, что и у ОП, и это было мое лучшее рабочее решение, поэтому я делюсь им ..
JeroenKnoops