cloud-presign
Version:
A unified presigned URL generator for multiple cloud platforms
225 lines (176 loc) • 5.87 kB
Markdown
# Cloud Presign
A unified presigned URL generator for multiple cloud platforms including AWS S3, Google Cloud Storage, Azure Blob Storage, and Digital Ocean Spaces.
## Features
- Generate presigned URLs for upload and download operations
- Support for multiple cloud providers:
- AWS S3
- Google Cloud Storage
- Azure Blob Storage
- Digital Ocean Spaces
- Consistent API across all providers
- Customizable URL expiration times
- Comprehensive error handling
- TypeScript support
## Installation
```bash
npm install cloud-presign
```
## Configuration
Configuration is loaded from environment variables. Create a `.env` file in your project root (see `.env.example` for reference):
```env
# Cloud Provider (aws, gcp, azure, digital_ocean)
CLOUD_PROVIDER=aws
CLOUD_REGION=us-east-1
PRESIGN_EXPIRATION=3600
# AWS Configuration
AWS_ACCESS_KEY_ID=your-access-key
AWS_SECRET_ACCESS_KEY=your-secret-key
AWS_REGION=us-east-1
AWS_BUCKET_NAME=your-bucket-name
```
## Usage
### Basic Usage
```typescript
import { generatePresignedUrl, HttpMethod, makeFilePublic } from 'cloud-presign';
async function getUploadUrl() {
const presignedData = await generatePresignedUrl({
prefix: 'folder',
key: 'filename.jpg',
isPublic: true // if want to make publically accessible
method: HttpMethod.PUT,
contentType: 'image/jpeg',
});
console.log('Upload URL:', presignedData.presignedUrl);
console.log('Expires at:', presignedData.expiresAt);
console.log('Headers:', presignedData.headers);
return presignedUrl;
}
async function getDownloadUrl() {
const presignedData = await generatePresignedUrl({
key: 'path/to/file.jpg',
method: HttpMethod.GET,
});
console.log('Download URL:', presignedData.presignedUrl);
return presignedData;
}
```
### Custom Expiration
```typescript
const presignedData = await generatePresignedUrl(
{
key: 'path/to/file.jpg',
method: HttpMethod.GET,
},
{
expiration: 7200, // 2 hours in seconds
}
);
```
### With Metadata
```typescript
const presignedData = await generatePresignedUrl({
prefix: 'folder',
key: 'filename.jpg',
isPublic: true // if want to make publically accessible
method: HttpMethod.PUT,
contentType: 'image/jpeg',
metadata: {
'x-amz-meta-original-filename': 'vacation-photo.jpg',
'x-amz-meta-user-id': '12345',
},
});
```
## Provider-Specific Usage
### AWS S3
```typescript
// Set environment variables
// CLOUD_PROVIDER=aws
// AWS_ACCESS_KEY_ID=your-access-key
// AWS_SECRET_ACCESS_KEY=your-secret-key
// AWS_REGION=us-east-1
// AWS_BUCKET_NAME=your-bucket-name
const presignedData = await generatePresignedUrl({
prefix: 'folder',
key: 'filename.jpg',
isPublic: true // if want to make publically accessible
method: HttpMethod.PUT,
contentType: 'image/jpeg',
});
// give access of acl to public read
await makeFilePublic(key);
```
### Google Cloud Storage
```typescript
// Set environment variables
// CLOUD_PROVIDER=gcp
// GCP_PROJECT_ID=your-project-id
// GCP_KEY_FILENAME=/path/to/service-account-key.json
// GCP_BUCKET_NAME=your-bucket-name
const presignedData = await generatePresignedUrl({
prefix: 'folder',
key: 'filename.jpg',
isPublic: true // if want to make publically accessible
method: HttpMethod.PUT,
contentType: 'image/jpeg',
});
// give access of acl to public read
await makeFilePublic(key);
```
### Azure Blob Storage
```typescript
// Set environment variables
// CLOUD_PROVIDER=azure
// AZURE_STORAGE_ACCOUNT_NAME=your-account-name
// AZURE_STORAGE_ACCOUNT_KEY=your-account-key
// AZURE_STORAGE_CONTAINER_NAME=your-container-name
const presignedData = await generatePresignedUrl({
prefix: 'folder',
key: 'filename.jpg',
isPublic: true // if want to make publically accessible
method: HttpMethod.PUT,
contentType: 'image/jpeg',
});
// give access of acl to public read for complete container.
// Note: this gives public access to all blobs in container as Azure does not support individual blob-level public ACLs.
await makeFilePublic(key);
```
### Digital Ocean Spaces
```typescript
// Set environment variables
// CLOUD_PROVIDER=digital_ocean
// DO_SPACES_ACCESS_KEY_ID=your-access-key
// DO_SPACES_SECRET_ACCESS_KEY=your-secret-key
// DO_SPACES_REGION=nyc3
// DO_SPACES_BUCKET_NAME=your-bucket-name
// DO_SPACES_ENDPOINT=https://nyc3.digitaloceanspaces.com
const presignedData = await generatePresignedUrl({
prefix: 'folder',
key: 'filename.jpg',
isPublic: true // if want to make publically accessible
method: HttpMethod.PUT,
contentType: 'image/jpeg',
});
// give access of acl to public read
await makeFilePublic(key);
```
## API Reference
### generatePresignedUrl(params, options?)
Generates a presigned URL for uploading or downloading files.
#### Parameters
- `params`: Object - Required parameters for generating the presigned URL
- `key`: string - Key/path of the file in storage
- `method`: HttpMethod - HTTP method (GET, PUT, POST, DELETE)
- `contentType`: string - Content type of the file (for upload)
- `contentLength`: number - Size of the file in bytes (for upload)
- `metadata`: Object - Additional metadata to store with the file
- `options`: Object - Optional parameters
- `expiration`: number - Expiration time in seconds
#### Returns
Promise resolving to an object with:
- `url`: string - The presigned URL
- `method`: HttpMethod - The HTTP method to use
- `expiresAt`: string - ISO timestamp when the URL expires
- `headers`: Object - Headers to include with the request
- `fields`: Object - Fields to include with the request (for POST upload)
## License
MIT