
Learn Multer in Express.js: From Basics to Advanced
By Sharan Panthi
#express#express.js#node.js#multer#file upload#single and multiple files#validate#limit#error handling
Let's learn Multer in Express.js step by step β from basics to advanced usage β with clear examples.
π¦ What is Multer?
Multer is a middleware for Express.js used to handle multipart/form-data, which is the format used for file uploads (images, PDFs, videos, etc.).
It lets you:
- Upload single or multiple files
- Store files locally or in memory
- Filter files (e.g., only images)
- Control file names and storage location
β 1. Install Multer
npm install multer
β 2. Basic Setup β Upload a Single File
β€ Folder structure (simple)
project/
ββ uploads/
ββ server.js
β€ server.js
const express = require('express');
const multer = require('multer');
const app = express();
const upload = multer({ dest: 'uploads/' });
app.post('/upload', upload.single('file'), (req, res) => {
console.log(req.file);
res.send('File uploaded!');
});
app.listen(3000, () => console.log('Server started on port 3000'));
β€ How to test
Use Postman:
- POST β http://localhost:3000/upload
- Body β form-data
- Add key
fileβ type: file β choose a file
π The file will save in uploads/ with a random filename.
β 3. Upload Multiple Files
Upload multiple files in the same field
app.post('/upload-multi', upload.array('photos', 10), (req, res) => {
console.log(req.files);
res.send('Multiple files uploaded!');
});
array(fieldName, maxCount)
Upload files from different fields
app.post('/upload-fields',
upload.fields([
{ name: 'avatar', maxCount: 1 },
{ name: 'gallery', maxCount: 5 }
]),
(req, res) => {
console.log(req.files);
res.send('Files uploaded from multiple fields');
}
);
π 4. Custom Storage with Filenames
By default, Multer gives random filenames. Letβs customize:
const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, 'uploads/');
},
filename: function (req, file, cb) {
const ext = file.originalname.split('.').pop();
cb(null, Date.now() + '-' + file.fieldname + '.' + ext);
}
});
const upload = multer({ storage });
Now the uploaded files have more readable names like:
1732459023000-file.png
π 5. Filter File Types (e.g., Only Images)
function fileFilter(req, file, cb) {
if (file.mimetype.startsWith('image/')) {
cb(null, true); // accept file
} else {
cb(new Error('Only images are allowed!'), false);
}
}
const upload = multer({
storage,
fileFilter
});
π§ 6. Limit File Size
const upload = multer({
storage,
limits: { fileSize: 2 * 1024 * 1024 } // 2 MB
});
If a file is too large, Multer automatically throws an error.
π« 7. Handling Multer Errors with Express Middleware
Instead of manually wrapping(commented script) upload.single(...), you can use Express error-handling middleware to catch Multer errors globally:
const express = require('express');
const multer = require('multer');
const app = express();
const upload = multer({ dest: 'uploads/' });
// app.post('/upload', (req, res) => {
// upload.single('file')(req, res, function (err) {
// if (err instanceof multer.MulterError) {
// return res.status(400).send('Multer error: ' + err.message);
// } else if (err) {
// return res.status(400).send('Error: ' + err.message);
// }
// res.send('File uploaded successfully');
// });
// });
app.post('/upload', upload.single('file'), (req, res) => {
res.send('File uploaded successfully');
});
// Error-handling middleware
app.use((err, req, res, next) => {
if (err instanceof multer.MulterError) {
// Multer-specific errors
res.status(400).send('Multer error: ' + err.message);
} else if (err) {
// Other errors
res.status(400).send('Error: ' + err.message);
} else {
next();
}
});
β Benefits of this approach:
- Separates route logic from error handling
- Works for multiple routes
- Cleaner and scalable for large apps
βοΈ 8. Bonus: Upload to Cloud Storage (S3, Cloudinary)
Once you're comfortable, you can:
- Store files in AWS S3
- Store images in Cloudinary
- Store only metadata in your database
π― Summary β What Youβve Learned
- Install and use Multer
- Upload single & multiple files
- Customize filenames
- Validate file type
- Limit file size
- Handle errors properly using Express middleware