ExpressJS File Uploads (Multer)
Imagine you're building a social media app where users can upload profile pictures, or an e-commerce site where sellers can add product images. How do you handle these files on the server? This is where file uploads come in, and Multer is the most popular middleware for handling multipart/form-data in Express.
What is Multer?
Multer is a Node.js middleware for handling
multipart/form-data, which is primarily used for uploading files. It adds a file or files object to the request object, making it easy to access uploaded files.Installing Multer
npm install multerBasic File Upload Example
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/'); // Files will be saved in 'uploads' folder
},
filename: (req, file, cb) => {
// Create unique filename: timestamp + original extension
const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9);
cb(null, file.fieldname + '-' + uniqueSuffix + path.extname(file.originalname));
}
});
// File filter function
const fileFilter = (req, file, cb) => {
// Accept only images
if (file.mimetype.startsWith('image/')) {
cb(null, true);
} else {
cb(new Error('Only images are allowed!'), false);
}
};
// Create multer instance with configuration
const upload = multer({
storage: storage,
limits: { fileSize: 5 * 1024 * 1024 }, // 5MB limit
fileFilter: fileFilter
});
// Serve static files from uploads folder (so users can view uploaded images)
app.use('/uploads', express.static('uploads'));
// Single file upload route
app.post('/upload/single', upload.single('profilePic'), (req, res) => {
try {
// req.file contains information about the uploaded file
console.log(req.file);
res.json({
success: true,
message: 'File uploaded successfully',
file: req.file
});
} catch (error) {
res.status(500).json({ error: error.message });
}
});HTML Form for File Upload
Multiple File Uploads
// Upload multiple files (max 5) with same field name
app.post('/upload/multiple', upload.array('photos', 5), (req, res) => {
try {
// req.files is an array of uploaded files
console.log(req.files);
res.json({
success: true,
message: `${req.files.length} files uploaded successfully`,
files: req.files
});
} catch (error) {
res.status(500).json({ error: error.message });
}
});
// Upload multiple files with different field names
app.post('/upload/fields', upload.fields([
{ name: 'avatar', maxCount: 1 },
{ name: 'gallery', maxCount: 8 }
]), (req, res) => {
// req.files is an object with field names as keys
console.log(req.files);
res.json({
success: true,
avatar: req.files['avatar'][0],
gallery: req.files['gallery']
});
});Advanced Example: Upload with Text Fields
app.post('/upload/profile', upload.single('profilePic'), (req, res) => {
// req.body contains text fields
const { name, email, bio } = req.body;
const profilePic = req.file;
// Save user data and file info to database
// ... your database logic here
res.json({
success: true,
user: { name, email, bio },
profilePic: profilePic
});
});Error Handling for Multer
const multer = require('multer');
app.post('/upload', (req, res) => {
upload.single('file')(req, res, (err) => {
if (err instanceof multer.MulterError) {
// A Multer error occurred (e.g., file too large)
return res.status(400).json({ error: err.message });
} else if (err) {
// An unknown error occurred
return res.status(500).json({ error: err.message });
}
// Everything went fine
res.json({ success: true, file: req.file });
});
});Two Minute Drill
- Multer handles multipart/form-data for file uploads in Express.
- Configure storage (diskStorage) to control where and how files are saved.
- Use fileFilter to restrict file types (e.g., only images).
- Set limits to prevent large file uploads.
- Use
upload.single(),upload.array(), orupload.fields()for different upload scenarios. - Always handle Multer errors properly.
- Remember to create the uploads folder before saving files.
Need more clarification?
Drop us an email at career@quipoinfotech.com
