home / skills / hoangnguyen0403 / agent-skills-standard / file-uploads
This skill securely handles file uploads in NestJS with validation, streaming to S3, and async processing to prevent DoS and scale.
npx playbooks add skill hoangnguyen0403/agent-skills-standard --skill file-uploadsReview the files below or copy the command above to add this skill to your agents.
---
name: NestJS File Uploads
description: Secure file handling, Validation, and S3 streaming.
metadata:
labels: [nestjs, upload, multer, s3]
triggers:
files: ['**/*.controller.ts']
keywords: [FileInterceptor, Multer, S3, UploadedFile]
---
# File Upload Patterns
## **Priority: P0 (FOUNDATIONAL)**
Secure file upload handling with validation and storage patterns.
- **Magic Bytes**: NEVER trust `content-type` header or file extension.
- **Tool**: Use `file-type` or `mmmagic` to verify the actual buffer signature.
- **Limits**: Set strict `limits: { fileSize: 5000000 }` (5MB) in Multer config to prevent DoS.
## Streaming (Scalability)
- **Memory Warning**: Default Multer `MemoryStorage` crashes servers with large files.
- **Pattern**: Use **Streaming** for any file > 10MB.
- **Library**: `multer-s3` (direct upload to bucket) or `busboy` (raw stream processing).
- **Architecture**:
1. Client requests Signed URL from API.
2. Client uploads directly to S3/GCS (Bypassing API server completely).
3. **Pro Tip**: This is the only way to scale file uploads infinitely.
## Processing
- **Async**: Don't process images/videos in the HTTP Request.
- **Flow**:
1. Upload file.
2. Push `FileUploadedEvent` to Queue (BullMQ).
3. Worker downloads, resizes/converts, and re-uploads.
This skill codifies secure and scalable file upload patterns for NestJS applications using TypeScript. It focuses on validation with magic-byte checks, strict request limits, streaming uploads for large files, and asynchronous processing with queues and workers. The guidance helps prevent DoS, avoid memory exhaustion, and enable infinite scaling via direct-to-cloud uploads.
The skill inspects incoming file buffers to verify actual file type using signature libraries (file-type or mmmagic) rather than trusting content-type or file extensions. It enforces strict Multer limits for small uploads and switches to streaming patterns (multer-s3 or busboy) for larger payloads. After upload, a FileUploadedEvent is pushed to a queue (BullMQ) so background workers can process and re-upload derivatives asynchronously.
Why not trust content-type or file extension?
Those headers and extensions can be spoofed; magic-byte inspection verifies the real format to prevent malicious uploads.
When should I use streaming vs memory storage?
Use memory storage for tiny files under strict limits; use streaming or direct-to-cloud uploads for files larger than ~10MB to avoid memory and stability issues.