Skip to Content
ProvidersAWS S3 Provider

AWS S3 Provider

Simple, reliable file storage with the AWS ecosystem.

Installation

pnpm add @fluxmedia/core @fluxmedia/s3 @aws-sdk/client-s3 @aws-sdk/lib-storage

Configuration

import { MediaUploader } from '@fluxmedia/core'; import { S3Provider } from '@fluxmedia/s3'; const uploader = new MediaUploader( new S3Provider({ region: 'us-east-1', bucket: 'my-media-bucket', accessKeyId: process.env.AWS_ACCESS_KEY_ID!, secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!, }) );

Configuration Options

OptionTypeRequiredDescription
regionstringYesAWS region (e.g., ‘us-east-1’)
bucketstringYesS3 bucket name
accessKeyIdstringYesAWS access key
secretAccessKeystringYesAWS secret key
endpointstringNoCustom endpoint (for S3-compatible services)
forcePathStylebooleanNoForce path style URLs

Basic Usage

const result = await uploader.upload(file, { folder: 'uploads', filename: 'my-file.jpg', }); console.log(result.url); // https://my-media-bucket.s3.us-east-1.amazonaws.com/uploads/my-file.jpg

Upload with Progress

const result = await uploader.upload(file, { folder: 'uploads', onProgress: (percent) => { console.log(`Upload progress: ${percent}%`); } });

Batch Uploads

Upload multiple files with concurrency control:

const results = await uploader.uploadMultiple(files, { folder: 'batch-uploads', concurrency: 5, onBatchProgress: (completed, total) => { console.log(`Uploaded ${completed}/${total} files`); } });

S3-Compatible Services

Works with DigitalOcean Spaces, MinIO, and other S3-compatible services:

// DigitalOcean Spaces const uploader = new MediaUploader( new S3Provider({ region: 'nyc3', bucket: 'my-space', accessKeyId: 'your-spaces-key', secretAccessKey: 'your-spaces-secret', endpoint: 'https://nyc3.digitaloceanspaces.com', forcePathStyle: false, }) ); // MinIO const uploader = new MediaUploader( new S3Provider({ region: 'us-east-1', bucket: 'my-bucket', accessKeyId: 'minio-access-key', secretAccessKey: 'minio-secret-key', endpoint: 'http://localhost:9000', forcePathStyle: true, }) );

Supported Features

S3 is storage-only (no transformations):

uploader.supports('transformations.resize') // false uploader.supports('capabilities.signedUploads') // true uploader.supports('capabilities.multipartUpload') // true

Native SDK Access

Access the underlying AWS S3 client for advanced operations:

const s3Client = uploader.provider.native; const { ListBucketsCommand } = await import('@aws-sdk/client-s3'); const buckets = await s3Client.send(new ListBucketsCommand({}));

Environment Variables

AWS_ACCESS_KEY_ID=your-access-key AWS_SECRET_ACCESS_KEY=your-secret-key AWS_REGION=us-east-1 S3_BUCKET=my-bucket

Adding Transformations

Use CloudFront + Lambda@Edge for image transformations, or consider Cloudinary for built-in support.

Last updated on