Истории успеха наших клиентов — лучшие проекты
Вход/ Регистрация

Использование Laravel с Timeweb Cloud S3 и Spatie/MediaLibrary

666
14 минут чтения
Средний рейтинг статьи: 5

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

Теперь мы перейдем к следующему этапу — интеграции пакета Spatie/MediaLibrary, который значительно упрощает управление медиаданными в Laravel. В сочетании с S3 этот инструмент открывает широкие возможности для загрузки, обработки и хранения файлов.

В данной инструкции мы разберем:

  • Установку пакета и зависимостей.
  • Настройку подключения к S3 через конфигурацию Laravel.
  • Настройку моделей для работы с медиаколлекциями и конверсиями изображений.
  • Использование очередей для обработки изображений.
  • Загрузку и управление файлами через маршруты и шаблоны.
  • Отображение медиафайлов с использованием преобразований.
  • Настройку пользовательского домена для S3.
  • Удаление медиафайлов.

Установка

Убедитесь, что установлен GD Graphics Library, необходимый для обработки изображений. Выполните команду:

    

Замените x на вашу актуальную версию PHP.

Установите библиотеку с помощью Composer:

    

Эта команда устанавливает любую доступную версию пакета spatie/laravel-medialibrary. Символ * означает, что Composer выберет последнюю доступную стабильную версию, которая соответствует остальным ограничениям версий в вашем проекте.

Опубликуйте миграции для библиотеки MediaLibrary:

    

Запустите миграции, чтобы создать необходимые таблицы в базе данных:

    

Для удобной настройки библиотеки опубликуйте её файл конфигурации:

    

Облачные серверы

Масштабируемые вычислительные ресурсы
по всему миру с почасовой оплатой.

Настройка пакета

Для корректной работы библиотеки Spatie/MediaLibrary настройте подключение S3 и другие параметры.

В файле конфигурации config/media-library.php настройте параметры загрузки. 

Укажите максимальный размер файла и используемый диск. Например:

    

В файле .env добавьте переменную для указания используемого диска:

    

После этого библиотека будет использовать указанный диск tws3 для хранения медиафайлов.

Настройка модели

Шаг 1: Подключение MediaLibrary к модели

Добавьте в модель app/Models/User.php:

    

Шаг 2: Регистрация коллекций и преобразований

Добавьте два метода registerMediaCollections и registerMediaConversions в файле app/Models/User.php:

Метод registerMediaCollections

Этот метод задаёт параметры для хранения медиафайлов, определяя «коллекции». Каждая коллекция описывает, как организовать файлы, связанные с моделью.

    
  • addMediaCollection('avatars'): Создаёт коллекцию с именем avatars, которая предназначена для хранения одного изображения (например, аватара).

  • singleFile(): Гарантирует, что в коллекции будет храниться только один файл. Если добавить новый файл, предыдущий будет автоматически удалён.

  • withResponsiveImages(): Автоматически генерирует адаптивные изображения (разные размеры для разных экранов) для всех файлов в этой коллекции. Это полезно для оптимизации отображения изображений на устройствах с разным разрешением.

Метод registerMediaConversions

Этот метод описывает, какие преобразования (конверсии) изображений нужно выполнить для добавленных файлов. Преобразования выполняются автоматически при добавлении файла в коллекцию.

    

Подробный разбор метода

addMediaConversion('thumb')

  • Создаёт конверсию с именем thumb (миниатюра).

  • width(150) и height(150): Устанавливают размеры преобразованного изображения — 150x150 пикселей.

  • sharpen(10): Применяет резкость с уровнем 10, чтобы сделать изображение чётче.

  • performOnCollections('avatars', 'gallery'): Указывает, что миниатюра должна создаваться для всех изображений, добавленных в коллекции avatars и gallery.

addMediaConversion('border')

  • Создаёт конверсию с именем border (изображение с рамкой).

  • width(250) и height(250): Устанавливают размеры изображения с рамкой — 250x250 пикселей.

  • sepia(): Накладывает сепию, придавая изображению эффект старины.

  • border(10, 'black', Manipulations::BORDER_OVERLAY): Добавляет чёрную рамку шириной 10 пикселей поверх изображения.

  • performOnCollections('gallery'): Указывает, что это преобразование применяется только к изображениям, добавленным в коллекцию gallery.

Полный листинг файла, который должен получиться:

    

Настройка очередей для обработки изображений

Поскольку процесс нарезки изображений может быть длительным, важно обеспечить бесперебойную работу приложения. Для этого Laravel и библиотека Spatie используют очереди, которые позволяют выполнять задачи в фоновом режиме. В этом примере мы настроим очереди с использованием адаптера database.

Сначала создадим таблицу для хранения задач очереди. Выполните команду:

    

Запустите миграции для создания таблицы в базе данных:

    

В файле .env укажите, что для очередей будет использоваться база данных:

    

Чтобы обработать задачи очереди, запустите следующий процесс:

    

Теперь задачи нарезки изображений будут выполняться асинхронно, не блокируя работу приложения.

Загрузка изображений

В файле routes/web.php напишем логику для загрузки изображений:

    
  • $user = User::find(1): Получается объект пользователя с ID  из базы данных.

  • if ($request->hasFile(<key>)) {}: Проверяет, был ли передан файл в запросе

  • addMediaFromRequest(<key>): Загружает файл из запроса с указанным ключом

  • toMediaCollection(<key>): Сохраняет файл в медиа-коллекцию. Конверсии изображений (если определены) будут применены автоматически.

  • addMultipleMediaFromRequest(['gallery']): Извлекает файлы из запроса, соответствующие ключу и возвращает коллекцию медиаобъектов для дальнейшей обработки. Метод предназначен для загрузки нескольких файлов за один вызов.

Настройка шаблона

В этом разделе мы настроим шаблон resources/views/profile/create.blade.php для загрузки аватара пользователя и фотогалереи:

    

Инструкция:

  • Откройте в браузере: http://localhost:8000/profile/create.

  • Для загрузки аватара выберите одно изображение в поле avatar.

  • Для загрузки нескольких фотографий в галерею используйте поле gallery[].

  • После выбора файлов нажмите кнопку «Загрузить».

Отображение изображений 

Теперь добавим функционал для отображения загруженных изображений в шаблон resources/views/profile/index.blade.php.

Код отображения аватара

    
  • $user->hasMedia('avatars'): Проверяет, есть ли у пользователя медиафайлы в коллекции avatars.

  • $user->getFirstMediaUrl('avatars', 'thumb'): Возвращает URL первого медиафайла в коллекции avatars с преобразованием thumb.

Отображение фотогалереи

Для вывода изображений из коллекции gallery используем следующие варианты:

Вариант 1. С преобразованием thumb:

    

Вариант 2. С преобразованием border:

    

Вариант 3. Вывод всех изображений responsive:

    

Полный код файла resources/views/profile/index.blade.php:

    

Для проверки откройте в браузере: http://localhost:8000/profile.

Страница без изображений:

Страница с изображениями:

Настройка пользовательского домена для облачного хранилища 

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

Для примера будет использоваться домен третьего уровня s3.domain.ru.

Шаг 1. Добавьте поддомен в панели управления

2024 12 05 13 20 12

Шаг 2. Настройка DNS-записи

В DNS настройках добавьте CNAME-запись для созданного поддомена, указывающую на адрес s3.twcstorage.ru.

Шаг 3. Привяжите домен к бакету

Свяжите поддомен с вашим бакетом S3 через панель управления Timeweb Cloud.

Подождите 15-20 минут, пока изменения вступят в силу.

Шаг 4. Обновление конфигурации Laravel

В файле .env задайте переменную окружения:

    

2024 12 05 13 32 18

Шаг 5. Проверка результата

Откройте приложение в браузере http://localhost:8000/profile и убедитесь, что в HTML-коде атрибут src у медиафайлов содержит ссылку на ваш домен, например:

    

Как удалить изображение

Для удаления изображений добавим функционал в маршруты и шаблон.

Маршрут для удаления

В файле routes/web.php добавьте следующий код:

    

Код в шаблоне

Добавьте код для удаления изображений в файл resources/views/profile/index.blade.php:

    

Как работает:

  • Откройте в браузере: http://localhost:8000/profile.

  • При клике по ссылке файл удаляется из облачного хранилища.

  • Удаление происходит через маршрут delete.media, который удаляет файл по его идентификатору.

Эта настройка позволяет легко управлять медиафайлами в приложении Laravel.

Выгодные тарифы на облако в Timeweb Cloud

Cloud MSK 15

477 ₽/мес

Процессор
1 x 3.3 ГГц
Память
1 ГБ
NVMe
15 ГБ
Канал
1 Гбит/с
Публичный IP
Cloud MSK 30

657 ₽/мес

Процессор
1 x 3.3 ГГц
Память
2 ГБ
NVMe
30 ГБ
Канал
1 Гбит/с
Публичный IP

Заключение

Использование Spatie/MediaLibrary в сочетании с облачным хранилищем S3 открывает широкие возможности для управления медиафайлами в приложении Laravel. Этот подход предлагает:

  1. Удобство загрузки: Простая настройка форм для загрузки единичных изображений (например, аватаров) и галерей.

  2. Гибкость отображения: Возможность настройки преобразований изображений, таких как создание миниатюр, изображений с рамками или адаптивных версий.

  3. Эффективное хранение: Надежное и масштабируемое хранение данных в S3 с поддержкой пользовательских доменов.

  4. Простое управление: Легкость удаления и замены медиафайлов через маршруты и интерфейс приложения.

  5. Масштабируемость: Обработка изображений в очередях гарантирует стабильность работы даже при больших объемах данных.

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

666
14 минут чтения
Средний рейтинг статьи: 5
Хотите внести свой вклад?
Участвуйте в нашей контент-программе за
вознаграждение или запросите нужную вам инструкцию
img-server