shash7
shash7

Reputation: 1738

Multer | Stop file upload

I am using expressjs 4.0 along with multer to handle file uploads.

Problem is, I want to stop file upload when the file's size exceeds a maxSize variable. But multer uploads file anyways.

Is there a way to stop this behaviour.

Some example code :

app.post('/upload', function(req, res) {

    var maxSize = 32 * 1000 * 1000 // 32mb max

    if(req.files.file.length > maxSize) {
        // stop upload
    } else {
        // continue
        res.send(201);
    }
});

Upvotes: 2

Views: 9116

Answers (5)

wellrafi
wellrafi

Reputation: 13

in multer "multer": "^1.4.2", use fileFilter opts to cancel upload

var uploadImage = multer({
    storage: storage,
    fileFilter: function (req, file, cb) {
        let list = ['png', 'jpg', 'jpeg']
        if (list.indexOf(file.mimetype.split('/')[1]) < 0) {
            console.log("false")
            return cb(null, false)
        }
        cb(null, true)
    }
});

Upvotes: 0

Frank Fang
Frank Fang

Reputation: 149

I think the best place to do this file size checking is on frontend instead of backend. When user selects a file to upload, we can get file size immediately, and alert user if the size exceeds allowed limit.

Here's how I do it:

$('#upload input').change(function(click) {
  var file = this.files[0];
  if (file.size > MAX_FILE_SIZE_MB * 1024 * 1024) {
    alert('Sorry, selected file exceeds allowed size limit (' + MAX_FILE_SIZE_MB + 'MB).');
    return false;
  }

  // Post file upload request via AJAX
  // ...
}

Upvotes: -2

Fernando Ghisi
Fernando Ghisi

Reputation: 488

That´s how I'm dealing with this problem in my project. It seems the best solution for now.

api.js

var multer = require('./config/multer')();
var utils = require('./utils');

module.exports = function(app, dao) {
  app.post('/docs/:system', multer, function(req, res) {
    var file = req.files.documento;
    if (file.truncated) {
      utils.removeFile(file.path); // remove the truncated file
      return res.status(413).end(); // 413 ("Request Entity Too Large")
    }
    ...
    res.status(200).send({_id : document._id});
  }); ...

config/multer.js

var multer = require('multer');
var config = require('./config')();

module.exports = function() {

    return multer({ dest: config.BASE_UPLOAD_FOLDER, limits: {fileSize: config.MAX_FILE_SIZE_FOR_UPLOAD},
      ...
      onFileSizeLimit: function (file) {
        console.log('> The file size exceeds the maximum size allowed (' + config.MAX_FILE_SIZE_FOR_UPLOAD/(1024*1024) + 'MB)');
      },
      onFileUploadComplete: function(file) {
        console.log('> File \'' + file.fieldname + '\' stored in \'' + file.path + '\'' + (file.truncated ? ' (TRUNCATED).' : '.') );
      }
    });

};

utils.js

var fs = require('fs');

var removeFile = function (filePath) {
  try {
    fs.unlink(filePath);
    console.log('File"' + filePath + '" removed!');     
  } catch (err) {
    ...
  }
};
...

exports.removeFile = removeFile;

Upvotes: 3

LorenzoGi
LorenzoGi

Reputation: 276

According to Multer documentation: (https://www.npmjs.org/package/multer) you could use onFileUploadStart(file), and return false if the size is above your limit.

For example:

var express = require('express');
var multer  = require('multer');

var maxSize = 32 * 1000 * 1000;

var app = express();
app.use(multer({
  dest: './uploads/',
  onFileUploadStart: function(file, req, res){
    if(req.files.file.length > maxSize) {
      return false;
    }
  })
}));

Upvotes: 3

atlex2
atlex2

Reputation: 2624

Try multer limits–

app.use('/userimage', multer({
  limits: { fileSize: 1* 1024 * 1024}, //1mb
  onFileUploadStart: function (file, req, res) {
    console.log(file.fieldname + ' fileupload is starting ...');
  }}));

Documentation here https://www.npmjs.org/package/multer

Upvotes: 2

Related Questions