Storage

Two storage backends: AWS S3 and Vercel Blob. Either (or both) can be enabled. Payload CMS uses whichever is available for media uploads.

AWS S3

AWS_REGION=us-east-1
AWS_ACCESS_KEY_ID=AKIA...
AWS_SECRET_ACCESS_KEY=...
AWS_BUCKET_NAME=my-bucket

Enables S3_ENABLED. Uses presigned URLs for uploads.

Vercel Blob

VERCEL_BLOB_READ_WRITE_TOKEN=vercel_blob_...

Enables VERCEL_BLOB_ENABLED. Zero-config if you're on Vercel.

How It's Used

  • Payload CMS media — uploads go to whichever storage is configured (@payloadcms/storage-s3 or @payloadcms/storage-vercel-blob)
  • File servicesrc/server/services/file.ts handles file operations
  • S3 servicesrc/server/services/s3.ts for direct S3 operations

The FILE_UPLOAD_ENABLED flag is true when either S3 or Vercel Blob is configured.

Key Files

FilePurpose
src/server/services/s3.tsS3 client + presigned URL generation
src/server/services/file.tsFile upload/download logic
src/server/actions/file.tsFile server actions
src/payload.config.tsPayload storage adapter config