multer callbacks not working ?

12,029

It seems the usage has been changed over time. Currently, multer constructor only accepts following options (https://www.npmjs.com/package/multer#multer-opts):

  • dest or storage - Where to store the files
  • fileFilter - Function to control which files are accepted
  • limits - Limits of the uploaded data

So, for example the renaming is to be solved by configuring appropriate storage (https://www.npmjs.com/package/multer#storage).

var storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, '/tmp/my-uploads'); // Absolute path. Folder must exist, will not be created for you.
  },
  filename: function (req, file, cb) {
    cb(null, file.fieldname + '-' + Date.now());
  }
})

var upload = multer({ storage: storage });

app.post('/profile', upload.single('fieldname'), function (req, res, next) {
    // req.body contains the text fields 
});

The fieldname must match the field name in the request body. That is, in case of HTML form post, the form upload element input name.

Also have a look for other middleware functions like array and fields - https://www.npmjs.com/package/multer#single-fieldname which provide a a little different functionality.

Also you may be interested in the limits (https://www.npmjs.com/package/multer#limits) and file filter (https://www.npmjs.com/package/multer#filefilter)

And also - source is the single source of truth - have a peek!(https://github.com/expressjs/multer/blob/master/index.js)

Share:
12,029
Ashraf Fayad
Author by

Ashraf Fayad

I'm an independent developer. I live in Hurghada, Red Sea , Egypt..

Updated on July 22, 2022

Comments

  • Ashraf Fayad
    Ashraf Fayad almost 2 years

    Anyone knows why the "rename" function (and all other multer callbacks) are not working?

    var express = require('express');
    var multer  = require('multer');
    
    var app = express();
    
    app.use(multer({
        dest: 'uploads/',
        rename: function (fieldname, filename) {
            return new Date().getTime();
        },
        onFileUploadStart: function (file) {
            console.log(file.name + ' is starting ...');
        },
        onFileUploadComplete: function (file, req, res) {
            console.log(file.name + ' uploading is ended ...');
            console.log("File name : "+ file.name +"\n"+ "FilePath: "+ file.path)
        },
        onError: function (error, next) {
            console.log("File uploading error: => "+error)
            next(error)
        },
        onFileSizeLimit: function (file) {
            console.log('Failed: ', file.originalname +" in path: "+file.path)
            fs.unlink(path.join(__dirname, '../tmpUploads/') + file.path) // delete the partially written file
        }
    }).array('photos', 12));
    
    
    
    app.listen(8080,function(){
        console.log("Working on port 8080");
    });
    
    app.get('/',function(req,res){
        res.sendFile(__dirname + "/index.html");
    });
    
    
    app.post('/photos/upload', function (req, res, next) {
        // req.files is array of `photos` files
        // req.body will contain the text fields, if there were any
        //console.log(req.files);
        //console.log(req.body);
        res.json(req.files)
    
    });
    
  • tiblu
    tiblu almost 9 years
    Oh, seems I did not save the or somehow reverted the working example. Updated, this one should be sufficient. Basically a sample from the manual. Thanks for pointing it out.
  • Sudhanshu Gaur
    Sudhanshu Gaur almost 9 years
    i am doing the same thing which you have wriiten above but it is not saving any image but when i write only this, var upload = multer({ dest: 'uploads/' }); then it works but i am now not able to save file with any particular file extension ??
  • tiblu
    tiblu almost 9 years
    The destination callback function needs to return absolute path. So for you following should work - cb(null, __dirname + '/uploads') - this will save files to the uploads subfolder in the same directory where the currently running script is. See __dirname in Node.JS manual - nodejs.org/docs/latest/api/globals.html#globals_dirname Will add edit my answer and add comment.
  • Sudhanshu Gaur
    Sudhanshu Gaur almost 9 years
    actually problem is not about folder problem is that code below destination which is filename does not work never gets called ?? PLS Help me i have spent days and nothing is happening....
  • tiblu
    tiblu almost 9 years
    @SudhanshuGaur Show me your code. Both the font-end HTML and backend. Make a new SO question maybe?
  • Sudhanshu Gaur
    Sudhanshu Gaur almost 9 years
  • Sudhanshu Gaur
    Sudhanshu Gaur almost 9 years
    Actually overall problem was i wasnt creating a folder first, thanks a lot for ur help.................. :)
  • aman verma
    aman verma almost 9 years
    for uploading array of pics do i have to define this number of pics user is uploading like here .array('photos', 12)) as because i dont know how many pics user is uploading and how can i change this variable dynamically ??
  • tiblu
    tiblu almost 9 years
    The signature is .array(fieldname[, maxCount]) meaning you do not have to specify a count at all. - npmjs.com/package/multer#multer-opts
  • Gil Beyruth
    Gil Beyruth over 7 years
    Is there any callback to know when the file is saved?