Skip to main content

Command Palette

Search for a command to run...

Handling File Uploads in Express with Multer

Understanding file uploads, Multer middleware, and storage handling in Express.js.

Published
•5 min read
Handling File Uploads in Express with Multer
G
I enjoy blending technology with business to build solutions that create real impact. I’m fascinated by how technology empowers people, businesses, and startups. I believe thoughtful use of technology quietly improves lives, and that belief fuels everything I build and explore 💻.

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:

  • destination defines where files will be stored

  • filename defines 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 name

  • Uploaded 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 name

  • 5 defines maximum allowed files

  • Uploaded 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.