multer-utility
Version:
A comprehensive TypeScript wrapper for Multer with enhanced features including memory/disk storage, flexible configuration, and file management utilities
302 lines (234 loc) • 7.68 kB
Markdown
# Multer Utility
A comprehensive TypeScript wrapper for Multer with enhanced features including memory/disk storage, flexible configuration, and file management utilities.
## Features
- 🚀 **TypeScript Support** - Fully typed with comprehensive interfaces
- 💾 **Multiple Storage Options** - Memory and disk storage with easy switching
- 🔧 **Flexible Configuration** - Customizable file validation, naming, and storage options
- 🛡️ **Advanced Validation** - MIME type and extension validation with custom rules
- 📁 **File Management** - Built-in utilities for file operations and statistics
- 🎯 **Specialized Uploaders** - Pre-configured uploaders for images, audio, etc.
- 🔄 **Memory & Disk Storage** - Switch between storage types effortlessly
## Installation
```bash
npm install multer-utility
```
## Quick Start
### Basic Usage
```typescript
import { UploadService } from 'multer-utility';
import express from 'express';
const app = express();
const uploader = new UploadService();
// Single file upload
app.post('/upload', uploader.single('file'), (req, res) => {
if (req.file) {
const fileInfo = uploader.getFileInfo(req.file);
res.json({ success: true, file: fileInfo });
}
});
```
### Memory Storage
```typescript
import { createMemoryUploader } from 'multer-utility';
const memoryUploader = createMemoryUploader({
maxFileSize: 1024 * 1024 * 10, // 10MB
allowedMimeTypes: ['image/jpeg', 'image/png']
});
app.post('/upload-memory', memoryUploader.single('image'), (req, res) => {
if (req.file) {
// File is stored in memory as buffer
const buffer = req.file.buffer;
// Process the buffer as needed
res.json({ success: true, size: buffer.length });
}
});
```
### Custom Disk Storage
```typescript
import { createDiskUploader } from 'multer-utility';
const diskUploader = createDiskUploader('/custom/upload/path', {
maxFileSize: 1024 * 1024 * 50, // 50MB
useTimestamp: true,
sanitizeFilenames: true
});
```
## Configuration Options
```typescript
interface UploadConfig {
// Storage configuration
storage?: 'disk' | 'memory';
uploadDir?: string;
// File validation
allowedMimeTypes?: string[];
allowedExtensions?: string[];
maxFileSize?: number; // in bytes
// Naming configuration
useTimestamp?: boolean;
sanitizeFilenames?: boolean;
customNaming?: (file: Express.Multer.File) => string;
// Advanced options
createDirIfNotExists?: boolean;
preserveOriginalName?: boolean;
}
```
## Advanced Usage
### Custom Configuration
```typescript
const uploader = new UploadService({
storage: 'disk',
uploadDir: './uploads/documents',
allowedMimeTypes: ['application/pdf', 'image/jpeg', 'image/png'],
allowedExtensions: ['.pdf', '.jpg', '.jpeg', '.png'],
maxFileSize: 1024 * 1024 * 25, // 25MB
useTimestamp: true,
sanitizeFilenames: true,
customNaming: (file) => `custom-${Date.now()}-${file.originalname}`
});
```
### Multiple File Upload
```typescript
// Array of files with same field name
app.post('/upload-multiple', uploader.array('files', 5), (req, res) => {
if (req.files && Array.isArray(req.files)) {
const fileInfos = req.files.map(file => uploader.getFileInfo(file));
res.json({ success: true, files: fileInfos });
}
});
// Multiple fields
app.post('/upload-fields', uploader.fields([
{ name: 'avatar', maxCount: 1 },
{ name: 'gallery', maxCount: 8 }
]), (req, res) => {
const files = req.files as { [fieldname: string]: Express.Multer.File[] };
res.json({ success: true, files });
});
```
### Pre-configured Uploaders
```typescript
import { createImageUploader, createAudioUploader } from 'multer-utility';
// Image uploader (JPEG, PNG, GIF, WebP)
const imageUploader = createImageUploader('./uploads/images');
// Audio uploader (MP3, WAV, OGG)
const audioUploader = createAudioUploader('./uploads/audio');
app.post('/upload-image', imageUploader.single('image'), (req, res) => {
// Handle image upload
});
app.post('/upload-audio', audioUploader.single('audio'), (req, res) => {
// Handle audio upload
});
```
## File Management
### File Operations
```typescript
const uploader = new UploadService({ storage: 'disk' });
// Check if file exists
const exists = uploader.fileExists('filename.jpg');
// Get file path
const filePath = uploader.getFilePath('filename.jpg');
// Delete file
const deleted = await uploader.deleteFile('filename.jpg');
// Get upload statistics
const stats = await uploader.getUploadStats();
console.log(stats);
// Output:
// {
// totalFiles: 15,
// totalSize: 2048576,
// files: [
// {
// name: 'file1.jpg',
// size: 102400,
// created: '2023-01-01T00:00:00.000Z',
// modified: '2023-01-01T00:00:00.000Z'
// }
// ]
// }
```
### File Validation
```typescript
const uploader = new UploadService();
// Validate file manually
const validation = uploader.validateFile(file);
if (!validation.isValid) {
console.error(validation.error);
}
```
## Error Handling
```typescript
app.post('/upload', uploader.single('file'), (req, res) => {
// Multer errors are automatically handled
// Custom validation errors are thrown as MulterError
});
// Error handling middleware
app.use((error, req, res, next) => {
if (error instanceof MulterError) {
switch (error.code) {
case 'LIMIT_FILE_SIZE':
return res.status(400).json({ error: 'File too large' });
case 'LIMIT_UNEXPECTED_FILE':
return res.status(400).json({ error: 'Invalid file type' });
default:
return res.status(400).json({ error: error.message });
}
}
next(error);
});
```
## Memory vs Disk Storage
### Memory Storage
- Files stored in memory as Buffer
- Faster access but limited by available RAM
- Good for small files or temporary processing
- Files don't persist after server restart
```typescript
const memoryUploader = createMemoryUploader();
// Access via req.file.buffer
```
### Disk Storage
- Files saved to filesystem
- Persistent storage
- Better for large files
- Includes file management utilities
```typescript
const diskUploader = createDiskUploader('./uploads');
// Access via req.file.path
```
## API Reference
### UploadService Class
#### Methods
- `single(fieldName: string)` - Handle single file upload
- `array(fieldName: string, maxCount?: number)` - Handle multiple files (same field)
- `fields(fields: multer.Field[])` - Handle multiple fields
- `any()` - Handle any files
- `none()` - No files expected
- `validateFile(file: Express.Multer.File)` - Validate file manually
- `getFileInfo(file: Express.Multer.File)` - Get detailed file information
- `deleteFile(filename: string)` - Delete file (disk storage only)
- `fileExists(filename: string)` - Check if file exists (disk storage only)
- `getFilePath(filename: string)` - Get file path (disk storage only)
- `getUploadStats()` - Get upload directory statistics
- `getConfig()` - Get current configuration
### Convenience Functions
- `createDiskUploader(uploadDir: string, config?: Partial<UploadConfig>)`
- `createMemoryUploader(config?: Partial<UploadConfig>)`
- `createImageUploader(uploadDir?: string)`
- `createAudioUploader(uploadDir?: string)`
## TypeScript Support
The package is fully typed and exports all necessary interfaces:
```typescript
import {
UploadService,
UploadConfig,
FileValidationResult,
MulterError
} from 'multer-utility';
```
## Author
[SURAJ] — suraj222615@gmail.com
GitHub: [https://github.com/suraj-o](https://github.com/suraj-o)
## Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
## License
MIT © [Suraj]
---
Made with ❤️ and TypeScript