Back

Technologies:

javascriptjavascript
node.jsnode.js
avatar
Tolerim
2 minutes ago

How can I enable image upload through a Node.js API?

Currently, I am working on Rest API development using Node.js and Express.js. While implementing the API, I need to upload images, but I also want to validate the image size, ensuring it is 300x300 pixels. I am already using Multer for file uploading, and this is my code:

var storage = multer.diskStorage({
  destination: function (req, file, callback) {
    callback(null, './uploads');
  },
  filename: function (req, file, callback) {
     const sizeOf = require('image-size');
     const originalname = file.originalname;
     const fileExt = originalname.split(".").pop();
     const excatName = originalname.split(".").slice(0, -1).join(".");
     console.log("mimetype is " + file.mimetype); // GETTING FILE EXTENSION NAME
     callback(null, excatName + "-" + Date.now().toString() + "." + fileExt);
  },
});

var multerFilter = function (req, file, cb) {
  const memeT = file.mimetype.split('/')[1];
  const restrictToMemeType = ['jpeg','jpg','png','gif'];
  if (restrictToMemeType.includes(memeT)) {
    cb(null, true);
  } else {
    cb(new Error('Sorry, the uploaded file type is invalid.'), false);
  }
};

var upload = multer({ storage: storage, fileFilter: multerFilter }).single('userPhoto');

const uploadAvatar = function (req, res) {
  upload(req, res, function(err) {
    if(err) {
      return res.end("Error uploading file: " + err);
    }
    res.end("File is uploaded: " + req.file.filename);
  });
};
Answers(1)
avatar
Tolerim
2 minutes ago
Verified Answer
To validate the image size before uploading, you can use the image-size package to get the dimensions of the image and check if they meet your criteria. Here's an updated code snippet with added image size validation:
var multer = require('multer');
var sizeOf = require('image-size');

var storage = multer.diskStorage({
  destination: function (req, file, callback) {
    callback(null, './uploads');
  },
  filename: function (req, file, callback) {
    const originalname = file.originalname;
    const fileExt = originalname.split(".").pop();
    const excatName = originalname.split(".").slice(0, -1).join(".");
    console.log("mimetype is " + file.mimetype); // GETTING FILE EXTENSION NAME
    callback(null, excatName + "-" + Date.now().toString() + "." + fileExt);
  },
});

var multerFilter = (req, file, cb) => {
  const memeT = file.mimetype.split('/')[1];
  const restrictToMemeType = ['jpeg','jpg','png','gif'];
  if (restrictToMemeType.includes(memeT)) {
    cb(null, true);
  } else {
    cb(new Error('sorry invalid meme type'), false);
  }
};

var upload = multer({
  storage: storage,
  fileFilter: multerFilter
}).single('userPhoto');

const uploadavatar = function (req, res) {
  upload(req, res, function(err) {
    if (err) {
      return res.end("Error uploading file." + err);
    }

    // Check image size
    const dimensions = sizeOf(req.file.path);
    if (dimensions.width != 300 || dimensions.height != 300) {
      return res.end("Invalid image size. Width and height must be 300x300 pixels.");
    }

    res.end("File is uploaded" + req.file.filename);
  });
};
In this updated code, we have added the sizeOf package to get the dimensions of the uploaded image. After that, we check if the dimensions match our criteria (300x300) and return an error message if they do not.
;