File Storage Providers
File storage providers handle file uploads, downloads, and storage management. They support both public files (accessible via URL) and private files (requiring presigned URLs).Available File Storage Providers
Medusa includes two file storage providers:Local File Provider
@medusajs/medusa/file-local - Stores files on the local filesystem.
Use cases:
- Development and testing
- Local deployments
- Simple file storage needs
- Not suitable for production with multiple servers
- No true private file support (files are in static directory)
- Limited scalability
S3 File Provider
@medusajs/medusa/file-s3 - Stores files in Amazon S3 or S3-compatible storage.
Use cases:
- Production deployments
- Scalable cloud storage
- Multi-server environments
- CDN integration
- True public/private file support
- Presigned URLs for secure access
- Multiple authentication methods (access keys or IAM roles)
- Compatible with S3-compatible services (MinIO, DigitalOcean Spaces, etc.)
Installation
Both providers are included in the core Medusa package:Configuration
- Local File
- S3 (Access Keys)
- S3 (IAM Role)
- S3-Compatible
Configure the local file provider:Options:
medusa-config.ts
upload_dir- Directory for storing files (default:static)private_upload_dir- Directory for private files (default:static)backend_url- Base URL for accessing files (default:http://localhost:9000/static)
File Provider Interface
All file providers extendAbstractFileProviderService and implement the following methods:
upload(file: ProviderUploadFileDTO): Promise<ProviderFileResultDTO>
Uploads a file.
filename- Original filenamemimeType- MIME type of the filecontent- File content (base64 or UTF-8 string)access-"public"or"private"
url- Public URL (for public files) or identifierkey- File key/identifier for future operations
getUploadStream(fileData: ProviderUploadStreamDTO): Promise<UploadStreamResult>
Gets a writable stream for uploading large files.
delete(files: ProviderDeleteFileDTO | ProviderDeleteFileDTO[]): Promise<void>
Deletes one or more files.
getDownloadStream(file: ProviderGetFileDTO): Promise<Readable>
Gets a readable stream for downloading a file.
getAsBuffer(file: ProviderGetFileDTO): Promise<Buffer>
Gets file content as a buffer.
getPresignedDownloadUrl(file: ProviderGetFileDTO): Promise<string>
Generates a presigned URL for downloading a private file.
Presigned URLs are temporary and expire after a configured duration
(default: 1 hour for S3).
getPresignedUploadUrl(fileData: ProviderGetPresignedUploadUrlDTO): Promise<ProviderFileResultDTO>
Generates a presigned URL for client-side uploads.
Using the File Module
Access file providers through the File Module:Creating Custom File Providers
Create a custom file provider by extendingAbstractFileProviderService:
packages/modules/providers/file-custom/src/services/custom-file.ts
packages/modules/providers/file-custom/src/index.ts
Reference
- Local File Source:
packages/modules/providers/file-local/src/services/local-file.ts - S3 Source:
packages/modules/providers/file-s3/src/services/s3-file.ts - Base class:
packages/core/utils/src/file/abstract-file-provider.ts - Types:
packages/core/types/src/file/provider.ts
Next Steps
Payment Providers
Configure payment processing
Notification Providers
Send file upload notifications