Open In App

Upload and Retrieve Image on MongoDB using Mongoose

Prerequisites: For getting started with this you should have some familiarity with NodeJS, ExpressJS, MongoDB, and Mongoose.

To start, install the required packages and modules:



npm install express --save
npm install body-parser --save
npm install mongoose --save
npm install multer --save
npm install dotenv --save
npm install ejs --save
npm install nodemon --save-dev

Project Structure:

 

Now let’s start coding!  To upload an image and retrieve an image by MongoDB using Mongoose, follow each of the steps below one by one.






var express = require('express')
var app = express();
var bodyParser = require('body-parser');
var mongoose = require('mongoose')
var imgSchema = require('./model.js');
var fs = require('fs');
var path = require('path');
app.set("view engine", "ejs");
require('dotenv').config();
 
mongoose.connect(process.env.MONGO_URL)
.then(console.log("DB Connected"))
 
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
 
var multer = require('multer');
 
var storage = multer.diskStorage({
    destination: (req, file, cb) => {
        cb(null, 'uploads')
    },
    filename: (req, file, cb) => {
        cb(null, file.fieldname + '-' + Date.now())
    }
});
 
var upload = multer({ storage: storage });
 
app.get('/', (req, res) => {
    imgSchema.find({})
    .then((data, err)=>{
        if(err){
            console.log(err);
        }
        res.render('imagepage',{items: data})
    })
});
 
 
app.post('/', upload.single('image'), (req, res, next) => {
 
    var obj = {
        name: req.body.name,
        desc: req.body.desc,
        img: {
            data: fs.readFileSync(path.join(__dirname + '/uploads/' + req.file.filename)),
            contentType: 'image/png'
        }
    }
    imgSchema.create(obj)
    .then ((err, item) => {
        if (err) {
            console.log(err);
        }
        else {
            // item.save();
            res.redirect('/');
        }
    });
});
 
var port = process.env.PORT || '3000'
app.listen(port, err => {
    if (err)
        throw err
    console.log('Server listening on port', port)
})




var mongoose = require('mongoose');
var imageSchema = new mongoose.Schema({
    name: String,
    desc: String,
    img:
    {
        data: Buffer,
        contentType: String
    }
});
 
module.exports = mongoose.model('Image', imageSchema);




<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Image Uploading</title>
  </head>
 
  <body>
    <h1>To Upload Image on mongoDB</h1>
    <hr />
    <div>
      <form action="/" method="POST" enctype="multipart/form-data">
        <div>
          <label for="name">Image Title</label>
          <input
            type="text"
            id="name"
            placeholder="Name"
            value=""
            name="name"
            required
          />
        </div>
        <div>
          <label for="desc">Image Description</label>
          <textarea
            id="desc"
            name="desc"
            value=""
            rows="2"
            placeholder="Description"
            required
          >
          </textarea>
        </div>
        <div>
          <label for="image">Upload Image</label>
          <input type="file" id="image" name="image" value="" required />
        </div>
        <div>
          <button type="submit">Submit</button>
        </div>
      </form>
    </div>
 
    <hr />
 
    <h1>Uploaded Images</h1>
    <div>
      <% items.forEach(function(image) { %>
      <div>
        <div>
          <img
            src="data:image/<%=image.img.contentType%>;base64,
                    <%=image.img.data.toString('base64')%>"
          />
          <div>
            <h5><%= image.name %></h5>
 
            <p><%= image.desc %></p>
          </div>
        </div>
      </div>
      <% }) %>
    </div>
  </body>
</html>

Output Open your browser to http://localhost:3000/ .  You should now see:
 


Article Tags :