Node.js · Express.js · Multer · ImageKit
Integrating Multer with ImageKit
Integrate Multer with ImageKit for efficient image uploads in Node.js and Express.

Table of Contents
Overview
In the world of web development, handling file uploads efficiently is crucial, especially for applications that require image uploads. In this blog post, we’ll explore how to integrate Multer, a middleware for handling multipart/form-data, with ImageKit, a real-time image optimization and transformation service, using Node.js and Express. We’ll also use Postman to test our API endpoints.
Prerequisites
Before you begin, ensure you have the following:
- Node.js installed.
- A MongoDB instance running (you can use MongoDB Atlas or a local instance).
- Basic knowledge of Express, MongoDB, and Postman.
- An ImageKit account (sign up at Imagekit.io).
Steps
Step 1: Setting Up the Project
Create a new directory for your project and initialize a new Node.js application:
mkdir multer-imagekit-mongo-example
cd multer-imagekit-mongo-example
npm init -yInstall the required packages:
npm install express multer axios dotenv mongoosePackages Overview:
- Express: Web framework for Node.js.
- Multer: Middleware for handling file uploads.
- Axios: For making HTTP requests to ImageKit.
- Mongoose: ODM for MongoDB.
- Dotenv: For managing environment variables.
Step 2: Setting Up MongoDB
Create a new file named Image.js in a folder called models to define our MongoDB schema:
// models/Image.js
const mongoose = require('mongoose');
const imageSchema = new mongoose.Schema({
filename: { type: String, required: true },
url: { type: String, required: true },
uploadedAt: { type: Date, default: Date.now },
});
module.exports = mongoose.model('Image', imageSchema);Step 3: Setting Up the Server
Create a new file named server.js:
// server.js
const express = require('express');
const multer = require('multer');
const mongoose = require('mongoose');
const path = require('path');
const axios = require('axios');
require('dotenv').config();
const Image = require('./models/Image');
const app = express();
const PORT = process.env.PORT || 3000;
// Configure multer storage
const storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, 'uploads/');
},
filename: (req, file, cb) => {
cb(null, `${Date.now()}-${file.originalname}`);
},
});
// Initialize multer
const upload = multer({ storage });
// Create the uploads directory if it doesn't exist
const fs = require('fs');
const dir = './uploads';
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir);
}
app.post('/upload', upload.single('image'), async (req, res) => {
try {
const filePath = path.join(__dirname, req.file.path);
const response = await axios({
method: 'post',
url: `https://upload.imagekit.io/api/v1/files/upload`,
headers: {
'Content-Type': 'multipart/form-data',
'Authorization': `Basic ${Buffer.from(process.env.IMAGEKIT_PUBLIC_KEY + ':').toString('base64')}`,
},
data: {
file: fs.createReadStream(filePath),
fileName: req.file.filename,
},
});
// Delete local file after uploading
fs.unlinkSync(filePath);
// Save image metadata to MongoDB
const newImage = new Image({
filename: req.file.filename,
url: response.data.url,
});
await newImage.save();
res.json({
message: 'Image uploaded to ImageKit successfully!',
image: newImage,
});
} catch (error) {
console.error(error);
res.status(500).json({ message: 'Failed to upload image.' });
}
});
app.listen(PORT, () => {
console.log(`Server is running on http://localhost:${PORT}`);
});Explanation
- MongoDB Connection: We connect to MongoDB using Mongoose.
- Image Model: We define a schema to store image metadata.
- Multer Setup: Multer is configured to handle file uploads.
- Image Upload Route: The uploaded image is sent to ImageKit, and the metadata is saved in MongoDB.
Step 4: Environment Variables
Create a .env file in the root of your project and add your MongoDB and ImageKit credentials:
MONGO_URI=your_mongodb_connection_string
IMAGEKIT_PUBLIC_KEY=your_public_key
IMAGEKIT_PRIVATE_KEY=your_private_key
IMAGEKIT_URL_ENDPOINT=https://ik.imagekit.io/your_imagekit_id
Step 5: Testing with Postman
You can now test the upload functionality using Postman:
-
Start the server:
node server.js -
Open Postman and create a new request:
- Set the request type to POST.
- Enter the URL:
http://localhost:3000/upload. - In the Body tab, select
form-data. - Add a key named
image, set it to type File, and choose an image from your computer.
-
Send the request. You should receive a JSON response containing the image metadata, including the URL from ImageKit.
Conclusion
In this tutorial, we integrated Multer for file uploads, ImageKit for image optimization, and MongoDB for storing image metadata in a Node.js and Express application. This setup not only enhances the user experience but also helps manage images efficiently.
Feel free to expand upon this foundation by adding features such as image retrieval, deleting images, or adding user authentication.
Happy coding!