Налаштування медіа-бібліотеки Payload CMS

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

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

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Налаштування медіа-бібліотеки Payload CMS
Проста
від 1 робочого дня до 3 робочих днів
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

Бібліотека медіа в Payload CMS

Payload керує медіафайлами через спеціальну колекцію з типом upload. Файли можуть зберігатися локально або в хмарі (S3, Cloudflare R2, GCS) через офіційні плагіни адаптерів.

Базова колекція Media

// collections/Media.ts
import type { CollectionConfig } from 'payload/types'

const Media: CollectionConfig = {
  slug: 'media',
  upload: {
    staticURL: '/media',
    staticDir: 'public/media',     // локальне зберігання
    imageSizes: [
      { name: 'thumbnail', width: 400, height: 300, crop: 'center' },
      { name: 'card', width: 768, height: 512, crop: 'center' },
      { name: 'tablet', width: 1024, withoutEnlargement: true },
    ],
    adminThumbnail: 'thumbnail',
    mimeTypes: ['image/*', 'application/pdf'],
    // максимальний розмір файлу (байти)
    limits: { fileSize: 10 * 1024 * 1024 },
  },
  fields: [
    {
      name: 'alt',
      type: 'text',
      required: true,
    },
    {
      name: 'caption',
      type: 'text',
    },
  ],
}

export default Media

S3-сховище через плагін

npm install @payloadcms/storage-s3
// payload.config.ts
import { s3Storage } from '@payloadcms/storage-s3'

export default buildConfig({
  plugins: [
    s3Storage({
      collections: {
        media: {
          prefix: 'media',
          generateFileURL: ({ filename, prefix }) =>
            `${process.env.CDN_URL}/${prefix}/${filename}`,
        },
      },
      bucket: process.env.S3_BUCKET!,
      config: {
        region: process.env.S3_REGION || 'eu-west-1',
        credentials: {
          accessKeyId: process.env.S3_ACCESS_KEY!,
          secretAccessKey: process.env.S3_SECRET_KEY!,
        },
        endpoint: process.env.S3_ENDPOINT,  // для Cloudflare R2 або MinIO
      },
    }),
  ],
})

Для Cloudflare R2 встановіть endpoint = https://<account-id>.r2.cloudflarestorage.com, region = auto.

Cloudflare R2 + трансформація зображень

// collections/Media.ts — трансформація URL через Cloudflare Images
upload: {
  imageSizes: [
    {
      name: 'thumbnail',
      generateImageName: ({ height, sizeName, extension, width }) =>
        `${sizeName}_${width}x${height}.${extension}`,
    },
  ],
  // Для R2 — не генерувати серверні зміни розміру, використовувати CF Image Resizing
  disableLocalStorage: true,
}

Завантаження файлів через API

// Завантаження через REST API
const formData = new FormData()
formData.append('file', fileBlob, 'image.jpg')
formData.append('alt', 'Опис зображення')

const response = await fetch('/api/media', {
  method: 'POST',
  headers: { Authorization: `Bearer ${token}` },
  body: formData,
})

const media = await response.json()
// media.url — URL файлу
// media.sizes.thumbnail.url — URL змінено розміру

Використання в інших колекціях

// Поле завантаження в колекції
{
  name: 'featuredImage',
  type: 'upload',
  relationTo: 'media',
  required: true,
}

// У Next.js компоненті
import Image from 'next/image'

const PostCard = ({ post }: { post: Post }) => {
  const image = post.featuredImage
  if (typeof image === 'string') return null  // не заповнено

  return (
    <Image
      src={image.sizes?.card?.url || image.url!}
      alt={image.alt}
      width={768}
      height={512}
    />
  )
}

Терміни

Налаштування бібліотеки медіа з S3/R2 сховищем, змінами розміру та інтеграцією колекцій — 0,5–1 день.