Який спосіб Ruby on Rails зберегти зображення?


9

Я розвиваюсь на iOS , і переходжу з PHP бекенда на Ruby on Rails. Формат обміну - JSON .

Швидкий пошук Google для "збереження зображень у Rails" майже в кожному результаті говорить про збереження даних зображення у вигляді крапок до бази даних. Я можу помилитися, але мені здається, що збереження даних про зображення в базі даних - це велика трата часу та простору (на відміну від збереження посилання на розташування файлу ('/img/subcat/4656.png') .

У PHP досить стандартно отримувати дані, генерувати ім’я файлу, зберігати цей файл на диску та оновлювати базу даних з розташуванням зображення на диску. Це те ж саме для Ruby on Rails, чи є якась вбудована функція зображення ActiveRecord, про яку я не знаю?


1
Я натрапив на PaperClip , який здається досить близьким до того, що я хочу. Ще б вдячний поради досвідченого фольклорного представника про те, як поводитися з обслуговуванням та отриманням тисяч зображень на оптимальній швидкості.
користувач

1
Ви знаєте, що зображення займе стільки ж місця на db або на диску, правда? З почуття кишки, я б сказав, що Rails зберігає в базі даних, оскільки вона не покладається на apache стільки, скільки PHP для кешування кешування. Це може бути абсолютно неправильно.
Флоріан Маргайн

2
Так, я не думаю, що дані зображення будуть маніпулювати місцем зберігання. Рейки можуть бути різними, але, здається , деякі надійні члени SO нахиляються до шляхів файлів у базі даних. Плюс, я думаю, що це звичайне знання, що бази даних важко масштабувати, тому зберігання тонн графічних даних у базі даних, безумовно, не спростить це.
користувач

Відповіді:


4

Що я робив у минулому, це використання PaperClip з Amazon S3 та CloudFront CDN для швидшої доставки. PaperClip дуже красиво підтримує сховище S3: виберіть їх документацію щодо параметрів конфігурації сховища S3 .

  1. Налаштуйте розподіл CloudFront для переадресації запитів на зображення у ваше відро S3 та інших запитів статичних активів у додаток Ruby on Rails (як альтернативу, ви можете також завантажувати їх у S3, але це не виходить за рамки цього питання).
  2. CNAME домен, яким ви керуєте (наприклад, asset.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потім можуть прийняти лямбда, що дозволить вам детерміновано (на основі активу) генеруйте URL-адреси, які використовують різні хости, для кращої паралелізації, якщо ви завантажуєте купу їх на одній сторінці, оскільки браузери обмежуватимуть максимальне одночасне з'єднання з тим самим хостом.)


3

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

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

Зазвичай ми шукаємо стабільне нестандартне рішення, а не відтворювати речі з нуля. З PaperClip я зберігаю зображення, а за допомогою StateMachine я перетворюю зображення і вводя їх у категорію на основі імені файлу. У мене було те саме питання, що і у вас, і це було моїм найкращим робочим рішенням, тому я поділяю це.


2
Це лише рекомендація для зовнішнього пакету для виконання роботи; ОП запитували, що зазвичай роблять Ruby on Rails для зберігання зображень, а не рекомендації. Хоча це може бути прикладом того, як це робить один пакет, це насправді не відповідає на питання.
Martijn Pieters

Правда. Зазвичай ми шукаємо стабільне нестандартне рішення, а не відтворювати речі з нуля. З PaperClip я зберігаю зображення, а за допомогою StateMachine я перетворюю зображення і вводя їх у категорію на основі імені файлу. У мене було те саме питання, що було у ОП, і це було моїм найкращим робочим рішенням, тому я
поділяюсь
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.