Table Of Contents
Problem
You need to handle file uploads in your Express.js application, whether it's profile pictures, documents, or multiple files, with proper validation and storage.
Solution
const express = require('express');
const multer = require('multer');
const path = require('path');
const app = express();
// Configure storage
const storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, 'uploads/'); // Make sure this directory exists
},
filename: (req, file, cb) => {
// Generate unique filename
const uniqueName = Date.now() + '-' + Math.round(Math.random() * 1E9);
cb(null, uniqueName + path.extname(file.originalname));
}
});
// Configure multer with validation
const upload = multer({
storage: storage,
limits: {
fileSize: 5 * 1024 * 1024 // 5MB limit
},
fileFilter: (req, file, cb) => {
// Allow only images
if (file.mimetype.startsWith('image/')) {
cb(null, true);
} else {
cb(new Error('Only image files are allowed!'), false);
}
}
});
// Single file upload
app.post('/upload/single', upload.single('profilePicture'), (req, res) => {
if (!req.file) {
return res.status(400).json({ error: 'No file uploaded' });
}
res.json({
message: 'File uploaded successfully',
file: {
filename: req.file.filename,
originalname: req.file.originalname,
size: req.file.size,
path: req.file.path
}
});
});
// Multiple files upload
app.post('/upload/multiple', upload.array('documents', 5), (req, res) => {
if (!req.files || req.files.length === 0) {
return res.status(400).json({ error: 'No files uploaded' });
}
res.json({
message: `${req.files.length} files uploaded successfully`,
files: req.files.map(file => ({
filename: file.filename,
originalname: file.originalname,
size: file.size
}))
});
});
app.listen(3000, () => {
console.log('Server running on port 3000');
});
Install multer and create uploads directory:
npm install multer
mkdir uploads
Explanation
Multer handles multipart/form-data
for file uploads. diskStorage
saves files to disk with custom naming. The fileFilter
function validates file types, while limits
restricts file size.
upload.single('fieldName')
handles one file, upload.array('fieldName', maxCount)
handles multiple files. The uploaded file info is available in req.file
(single) or req.files
(multiple) containing filename, size, and path details.
Share this article
Add Comment
No comments yet. Be the first to comment!