'Is there any option to reduce the image size and resize the image in nodejs with multer functionality?

var storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, '/tmp/my-uploads')
  },
  filename: function (req, file, cb) {
    cb(null, file.fieldname + '-' + Date.now())
  }
})

var upload = multer({ storage: storage })

I need to resize the image and compress the image size to lowest and upload into the directory.Any help?



Solution 1:[1]

You can create a customized Storage Engine for multer.

According to the official documentation, custom Storage Engines are classes that expose two functions: _handleFile and _removeFile.

Here is the official template for creating a custom Storage Engine (Link):

var fs = require('fs')

function getDestination (req, file, cb) {
  cb(null, '/dev/null')
}

function MyCustomStorage (opts) {
  this.getDestination = (opts.destination || getDestination)
}

MyCustomStorage.prototype._handleFile = function _handleFile (req, file, cb) {
  this.getDestination(req, file, function (err, path) {
    if (err) return cb(err)

    var outStream = fs.createWriteStream(path)

    file.stream.pipe(outStream)
    outStream.on('error', cb)
    outStream.on('finish', function () {
      cb(null, {
        path: path,
        size: outStream.bytesWritten
      })
    })
  })
}

MyCustomStorage.prototype._removeFile = function _removeFile (req, file, cb) {
  fs.unlink(file.path, cb)
}

module.exports = function (opts) {
  return new MyCustomStorage(opts)
}

You can reduce the image size on the _handleFile function before saving it to the disk.

For reducing the image size you can choose form a variety of npm modules which do this job. Some modules worth checking are Sharp, Light-weight image processor and GraphicsMagick for node.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Kayvan Mazaheri