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-s3or@payloadcms/storage-vercel-blob) - File service —
src/server/services/file.tshandles file operations - S3 service —
src/server/services/s3.tsfor direct S3 operations
The FILE_UPLOAD_ENABLED flag is true when either S3 or Vercel Blob is configured.
Key Files
| File | Purpose |
|---|---|
src/server/services/s3.ts | S3 client + presigned URL generation |
src/server/services/file.ts | File upload/download logic |
src/server/actions/file.ts | File server actions |
src/payload.config.ts | Payload storage adapter config |