Skip to main content

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
Limitations:
  • 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
Features:
  • 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:
For S3, also install the AWS SDK:

Configuration

Configure the local file provider:
medusa-config.ts
Options:
  • 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 extend AbstractFileProviderService and implement the following methods:

upload(file: ProviderUploadFileDTO): Promise<ProviderFileResultDTO>

Uploads a file.
Parameters:
  • filename - Original filename
  • mimeType - MIME type of the file
  • content - File content (base64 or UTF-8 string)
  • access - "public" or "private"
Returns:
  • url - Public URL (for public files) or identifier
  • key - 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 extending AbstractFileProviderService:
packages/modules/providers/file-custom/src/services/custom-file.ts
Register your custom provider:
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