Что такое способ сохранения изображений в 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-адреса, использующие разные хосты, для лучшего распараллеливания, если вы загружаете их на одной странице, так как браузеры ограничивают максимальное количество одновременных подключений к одному хосту.)


3

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

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

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


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

Правда. Что мы обычно делаем, так это ищем стабильное готовое к конфигурированию решение вместо воссоздания материала с нуля. С помощью PaperClip я сохраняю изображения, а с помощью StateMachine я делаю преобразования для изображений и помещаю их в категорию на основе имени файла. У меня был тот же вопрос, что и у ОП, и это было мое лучшее рабочее решение, поэтому я делюсь им ..
— JeroenKnoops
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.