Mohan
Mohan

Reputation: 385

why image is saving as text file in node js

Here i'm trying to save the image in database using multer but image type is saving as a text format but not in .png , .jpeg, .jpg format,

PLease help me where i'm doing wrong thanks in advance

Schema:-

module.exports = mongoose => {

const Role = mongoose.model(
  "role",
  mongoose.Schema(
    {
     roleType : { type:String },
     image: {  type: String,
      data: Buffer}
    }
  )
);
return Role;

};

controller (Creating an instance):-

exports.addRoleFields = async (req, res) => {
   const rolesList = new Role ({     
  roleType : req.body.roleType,
  roleImg  : req.file.path,
});
rolesList
.save(rolesList)   
  .then(data => {
    res.status(200).send({ data, statusCode: "200" });
  })
  .catch(err => {
    res.status(500).send({
      message: err.message || "Some error occurred while creating.",
      statusCode: "500"
    });
  })
 }
 }

routes:-

   module.exports = app => {

    const multer = require("multer"),
       storage = multer.diskStorage({
         destination: function(req, file, cb) {
          cb(null, 'uploads')
         },
         filename: function(req, file, cb) {
         cb(null, file.fieldname + '-' + Date.now())
        }
       })
  const uploadImg = multer({storage: storage}).single('image');
  
  const roles = require("../controllers/roles.js");
  var router = require("express").Router();
   router.post("/addRole", uploadImg , roles.addRoleFields);
  app.use('/api/roles', router);
 };

enter image description here

Upvotes: 2

Views: 435

Answers (3)

Mohan
Mohan

Reputation: 385

I simply changed this

 filename: function(req, file, cb) {
     cb(null, file.fieldname + '-' + Date.now())
  }

to

filename: function (req, file, cb) {
    cb(null, file.originalname);
}

its working and saving the file

Upvotes: 2

AliTigerK9
AliTigerK9

Reputation: 11

mongoose model

const imgSave = new mongoose.Schema({
    img:{
        data: Buffer,
        contentType: String
    }
});

Upvotes: 0

Dr. Selva Mary G
Dr. Selva Mary G

Reputation: 688

try this for mongodb client

const storage = multer.diskStorage({
    destination: async function (req, file, cb) {
        let path = 'uploads/' + req.body.path;
        if (!fs.existsSync(path)) {
            fs.mkdirSync(path, { recursive: true }, (err) => {
                if (err) throw err;
            });
        }
        await cb(null, path);
    },
    filename: function (req, file, cb) {

        cb(null, req.body.filename)
    }
});

var upload = multer({ storage: storage })

const router = express.Router();

// Upload Image
router.post("/upload", upload.single('image'), (req, res, next) => {
    return res.json({
        image: req.file.path
    });
});

in this upload.single('image'), file should be the name in which formdata carries the file. in your case,

 router.post("/addRole", uploadImg('image'), (req, res)=>{
});

Upvotes: 0

Related Questions