Skip to Content

How to Upload Images in Node.js Using Multer:

Uploading images is a common feature in web applications, especially when handling user profiles, product images, or documents.
Introduction:

Uploading images is a common feature in web applications, especially when handling user profiles, product images, or documents. In Node.js, the best way to handle image uploads is by using Multer, a middleware that simplifies handling multipart/form-data requests.

In this guide, we'll explore how to set up image upload functionality in a Node.js application using Multer. By the end, you’ll be able to upload and serve images in your application efficiently.

What is Multer?

Multer is a middleware for handling multipart/form-data, primarily used for file uploads in Node.js applications. It allows users to upload files, manage storage, and filter file types.

Why Use Multer?
  • Handles multipart/form-data efficiently
  • Allows file filtering (accept only images)
  • Supports different storage engines (Disk, Memory, Cloud Storage)
  • Provides limits on file size to prevent excessive uploads
Setting Up Node.js and Express

Before we begin, ensure you have Node.js installed. If not, download it from nodejs.org.

1. Initialize a Node.js Project

Run the following command to initialize a new Node.js project:

mkdir image-upload-multer
cd image-upload-multer
npm init -y

This will generate a package.json file for managing dependencies.

2. Install Required Packages

We need Express for the server and Multer for handling image uploads.

npm install express multer
Creating the Server and Image Upload Functionality
1. Import Required Modules

Create an index.js file and set up the Express server.

const express = require('express');
const multer = require('multer');
const path = require('path');

const app = express();


People also read:


2. Configure Multer for Image Uploads

Multer provides storage options for handling file uploads. We'll configure it to store images in an uploads/ folder.

// Set storage engine
const storage = multer.diskStorage({
    destination: './uploads/',
    filename: (req, file, cb) => {
        cb(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname));
    }
});

// Initialize Multer
const upload = multer({
    storage: storage,
    limits: { fileSize: 5 * 1024 * 1024 }, // Limit: 5MB
    fileFilter: (req, file, cb) => {
        const fileTypes = /jpeg|jpg|png/;
        const extName = fileTypes.test(path.extname(file.originalname).toLowerCase());
        const mimeType = fileTypes.test(file.mimetype);
        if (extName && mimeType) {
            return cb(null, true);
        } else {
            cb(new Error('Only images (JPG, JPEG, PNG) are allowed!'));
        }
    }
});
3. Create an Image Upload Route

Now, create an endpoint to handle image uploads.

app.post('/upload', upload.single('image'), (req, res) => {
    if (!req.file) {
        return res.status(400).json({ message: 'No file uploaded!' });
    }
    res.json({ message: 'Image uploaded successfully', filePath: `/uploads/${req.file.filename}` });
});

Here’s what happens:

  • upload.single('image') processes one file with the field name image
  • The uploaded file is stored in the uploads/ directory
  • The response contains the uploaded file path
4. Serve Uploaded Images

To serve uploaded images, make the uploads/ directory static:

app.use('/uploads', express.static('uploads'));
5. Start the Server

Add the following code to start the server:

const PORT = 5000;
app.listen(PORT, () => {
    console.log(`Server running on port ${PORT}`);
});

Run the server using:

node index.js

Testing the Image Upload with Postman

To test the API:

  1. Open Postman
  2. Set the request type to POST
  3. Use the URL: http://localhost:5000/upload
  4. Go to Body > form-data
  5. Set Key: image, Type: File, and select an image
  6. Click Send
  7. You should receive a response with the uploaded file path

To view the uploaded image, visit:

http://localhost:5000/uploads/{your_uploaded_image}.jpg
Enhancing Image Upload Functionality
1. Restrict File Types

Multer’s fileFilter function ensures only JPEG, JPG, and PNG files are allowed.

2. Set File Size Limits

The limits option restricts file sizes to 5MB.

3. Upload Multiple Images

Modify the route for multiple file uploads:

app.post('/upload-multiple', upload.array('images', 5), (req, res) => {
    if (!req.files || req.files.length === 0) {
        return res.status(400).json({ message: 'No files uploaded!' });
    }
    res.json({ message: 'Images uploaded successfully', files: req.files.map(file => `/uploads/${file.filename}`) });
});

Here, upload.array('images', 5) allows up to 5 files with the field name images.

4. Store Images in Cloud Storage (Optional)

Instead of storing images locally, you can use cloud services like Cloudinary, AWS S3, or Firebase Storage for scalability.


You may also like to read this Article:


Conclusion:

In this blog post, we covered: 

  • Setting up a Node.js server with Express 
  • Configuring Multer for image uploads 
  • Creating an API endpoint to handle image uploads 
  • Serving uploaded images statically 
  • Enhancing file validation and security

Now, you can easily integrate image uploads in your Node.js applications using Multer.

Need help with cloud storage integration? Let me know in the comments or contact us! 

Rajan Bhandari February 11, 2025
Share this post
Archive
Sign in to leave a comment
Roadmap to Becoming an Odoo Developer for Beginners
This article helps you to understand the roadmap for becoming a odoo developer.