Handling File Uploads in Express with Multer
Understanding file uploads, Multer middleware, and storage handling in Express.js.

If you’ve started building backend applications using Express.js, chances are you’ve already encountered situations where users need to upload files. Whether it’s profile pictures, PDFs, resumes, product images, or documents, file uploading becomes a very common backend requirement in real-world applications. Initially, many beginners assume file uploads work exactly like normal JSON request data, but file handling in Express works slightly differently internally.
This is exactly where Multer comes into the picture.
Multer is one of the most commonly used middleware packages for handling file uploads in Express.js applications. It simplifies how servers receive, process, and store uploaded files from clients. Without middleware like Multer, Express alone cannot properly handle multipart form-data requests containing files.
In this blog, we’ll understand why file uploads need middleware, what Multer actually is, how single and multiple file uploads work, basic storage configuration, and how uploaded files are served from the backend.
Why File Uploads Need Middleware
Normally, Express can easily handle JSON request bodies using middleware like:
app.use(express.json());
But file uploads work differently.
Whenever files are uploaded through forms, the request content type becomes:
multipart/form-data
This format is more complex because the request contains binary file data instead of simple JSON text. Express does not parse this automatically.
That is why middleware like Multer becomes necessary. Multer processes multipart form-data requests, extracts uploaded files, and makes them accessible inside the backend application.
What Exactly is Multer?
Multer is a middleware package specifically designed for handling file uploads in Express.js.
It processes incoming multipart form-data requests and provides access to uploaded files through the request object.
Installation:
npm install multer
Basic setup:
const express = require("express");
const multer = require("multer");
const app = express();
Once configured, Multer sits between the incoming request and the route handler, processes the uploaded files, and stores them according to the provided configuration.
Understanding the Upload Flow
The upload lifecycle becomes much easier to understand once the request flow is clear.
The flow usually looks like this:
Client selects file
Form sends multipart/form-data request
Multer middleware processes the file
File gets stored
Route handler receives file information
Server sends response
Multer basically acts as the processing layer responsible for extracting and managing uploaded files before the route logic executes.
Handling Single File Upload
Single file uploads are extremely common for profile images, resumes, or document uploads.
First, create a storage configuration.
Example:
const storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, "uploads/");
},
filename: (req, file, cb) => {
cb(null, Date.now() + "-" + file.originalname);
}
});
Here:
destinationdefines where files will be storedfilenamedefines how files will be named
Now initialize Multer:
const upload = multer({ storage });
Single file upload route:
app.post("/upload", upload.single("image"), (req, res) => {
console.log(req.file);
res.send("File uploaded");
});
Here:
upload.single()handles one uploaded file"image"must match the frontend form field nameUploaded file information becomes available inside
req.file
Understanding req.file
After successful upload, Multer adds file details into req.file.
Example output:
{
fieldname: 'image',
originalname: 'photo.png',
filename: '174686-photo.png',
path: 'uploads/174686-photo.png'
}
This information becomes useful for saving file paths into databases or returning uploaded file URLs back to the frontend.
Handling Multiple File Uploads
Sometimes applications need multiple file uploads together.
For example:
Product galleries
Multiple documents
Image collections
Multer handles this using upload.array().
Example:
app.post("/uploads", upload.array("images", 5), (req, res) => {
console.log(req.files);
res.send("Files uploaded");
});
Here:
"images"is the field name5defines maximum allowed filesUploaded files become available inside
req.files
Unlike req.file, multiple uploads return an array of file objects.
Serving Uploaded Files
After files are uploaded, the backend often needs to serve them publicly so the frontend can access them.
Express provides static middleware for this.
Example:
app.use("/uploads", express.static("uploads"));
Now uploaded files become accessible using URLs like:
http://localhost:3000/uploads/photo.png
This allows frontend applications to display uploaded images directly from the server.
Real-World Example
Suppose a user uploads a profile picture.
Flow:
Frontend sends multipart/form-data request
Multer processes file
File gets stored inside uploads folder
File path gets saved in database
Backend returns image URL
Frontend displays uploaded image
This exact flow is used in many real-world applications involving avatars, resumes, product images, or document management systems.
Why Multer Became Popular
Multer became extremely popular because handling multipart form-data manually is quite complicated. File uploads involve binary streams, boundaries, metadata, and storage handling internally.
Multer abstracts most of that complexity and provides a very clean middleware-based solution for Express.js applications. Instead of manually processing uploaded file streams, developers can focus directly on backend logic and storage handling.
Common Beginner Mistake
One very common beginner mistake is forgetting the form encoding type on the frontend.
For file uploads, forms must use:
enctype="multipart/form-data"
Without this encoding type, files will not properly reach the backend server.
Another common mistake is forgetting to create the uploads directory before storing files.
Final Thoughts
File uploading becomes one of the most practical backend features while building real-world applications. Since normal JSON middleware cannot process multipart form-data requests, middleware like Multer becomes necessary for handling uploaded files properly.
Multer simplifies the entire upload flow by processing incoming files, storing them, and exposing file information through the request object. Whether it’s single uploads, multiple uploads, profile pictures, PDFs, or product galleries, Multer provides a clean and efficient solution for handling file uploads in Express.js applications.



