javascript
Utilities
File Upload Handler with Validation
Multer-based file upload middleware with MIME type validation, file size limits, and secure filename generation.
Apex Logic
0 copies
javascript
const multer = require('multer');
const path = require('path');
const crypto = require('crypto');
const ALLOWED_TYPES = {
'image/jpeg': '.jpg',
'image/png': '.png',
'image/webp': '.webp',
'application/pdf': '.pdf'
};
const MAX_SIZE = 5 * 1024 * 1024; // 5MB
const storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, path.join(__dirname, '../uploads'));
},
filename: (req, file, cb) => {
const uniqueId = crypto.randomBytes(16).toString('hex');
const ext = ALLOWED_TYPES[file.mimetype] || path.extname(file.originalname);
cb(null, `${Date.now()}-${uniqueId}${ext}`);
}
});
const fileFilter = (req, file, cb) => {
if (ALLOWED_TYPES[file.mimetype]) {
cb(null, true);
} else {
cb(new Error(`File type ${file.mimetype} not allowed. Accepted: ${Object.keys(ALLOWED_TYPES).join(', ')}`), false);
}
};
const upload = multer({
storage,
fileFilter,
limits: { fileSize: MAX_SIZE, files: 5 }
});
const handleUploadError = (err, req, res, next) => {
if (err instanceof multer.MulterError) {
if (err.code === 'LIMIT_FILE_SIZE') {
return res.status(400).json({ error: 'File too large (max 5MB)' });
}
return res.status(400).json({ error: err.message });
}
if (err) return res.status(400).json({ error: err.message });
next();
};
module.exports = { upload, handleUploadError };