Working with File Uploads in Node.js
Learn how to handle file uploads using popular middleware and optimize file processing in your Node.js application.
0 likes
3 views
Rule Content
{ "title": "Working with File Uploads in Node.js", "description": "Learn how to handle file uploads using popular middleware and optimize file processing in your Node.js application.", "category": "Node.js Cursor Rules", "rules": [ { "name": "Use Multer for Handling File Uploads", "description": "Implement Multer middleware to manage `multipart/form-data` for efficient file uploads in Express applications.", "code": "const multer = require('multer');\nconst upload = multer({ dest: 'uploads/' });\napp.post('/upload', upload.single('file'), (req, res) => {\n res.send('File uploaded successfully');\n});" }, { "name": "Set File Size Limits", "description": "Configure Multer to limit the size of uploaded files to prevent resource exhaustion and enhance security.", "code": "const upload = multer({\n dest: 'uploads/',\n limits: { fileSize: 2 * 1024 * 1024 } // 2 MB\n});" }, { "name": "Validate File Types", "description": "Use Multer's `fileFilter` option to restrict uploads to specific file types, ensuring only allowed formats are processed.", "code": "const upload = multer({\n dest: 'uploads/',\n fileFilter: (req, file, cb) => {\n const allowedTypes = ['image/jpeg', 'image/png', 'image/gif'];\n if (allowedTypes.includes(file.mimetype)) {\n cb(null, true);\n } else {\n cb(new Error('Invalid file type'), false);\n }\n }\n});" }, { "name": "Implement Secure File Storage Practices", "description": "Generate safe filenames and store uploaded files in directories with appropriate permissions to prevent unauthorized access.", "code": "const crypto = require('crypto');\nconst path = require('path');\nconst fs = require('fs');\nconst generateSafeFilename = (originalName) => {\n const ext = path.extname(originalName);\n const baseName = path.basename(originalName, ext);\n const sanitizedBase = baseName.replace(/[^a-z0-9]/gi, '_').substring(0, 50);\n const randomHash = crypto.randomBytes(4).toString('hex');\n return `${sanitizedBase}_${randomHash}${ext}`;\n};\nconst uploadDir = path.join(__dirname, 'uploads');\nfs.mkdirSync(uploadDir, { recursive: true, mode: 0o755 });\nconst storage = multer.diskStorage({\n destination: uploadDir,\n filename: (req, file, cb) => {\n cb(null, generateSafeFilename(file.originalname));\n }\n});\nconst upload = multer({ storage });" }, { "name": "Optimize Middleware Usage", "description": "Apply middleware only to specific routes where necessary to minimize overhead and improve performance.", "code": "app.use('/upload', upload.single('file'), (req, res) => {\n res.send('File uploaded successfully');\n});" }, { "name": "Implement Rate Limiting for File Uploads", "description": "Use rate limiting middleware to prevent abuse and ensure fair usage of file upload endpoints.", "code": "const rateLimit = require('express-rate-limit');\nconst uploadLimiter = rateLimit({\n windowMs: 60 * 1000, // 1 minute\n max: 5 // Max 5 uploads per minute\n});\napp.post('/upload', uploadLimiter, upload.single('file'), (req, res) => {\n res.send('File uploaded successfully');\n});" }, { "name": "Serve Files Securely", "description": "Place the `uploads` directory outside the web root in production and serve files only after validating permissions.", "code": "const path = require('path');\napp.get('/uploads/:filename', (req, res) => {\n const filePath = path.join(__dirname, 'uploads', req.params.filename);\n // Add permission checks here\n res.sendFile(filePath);\n});" }, { "name": "Monitor and Benchmark Middleware", "description": "Use monitoring tools to identify performance bottlenecks in middleware and optimize accordingly.", "code": "const expressStatusMonitor = require('express-status-monitor');\napp.use(expressStatusMonitor());" } ] }