6
votes

I'm using Multer module for file uploads. While it all works ok, there's a warning at the end of their github page, which reads: "WARNING: req.body is fully parsed after file uploads have finished. Accessing req.body prematurely may cause errors."

This has got me really worried. I just can't find a way to let the .post middleware know when the file(s) have been uploaded and req.body is ready to use. Here's my code:

app.js:

app.use(multer({ 
        dest: './uploads/',
        rename: function (fieldname, filename) {
            return filename.replace(/\W+/g, '-').toLowerCase() + Date.now();
        },
        putSingleFilesInArray: true       
        })
);

upload.js:

router.route('/')
    .get(function(req, res){
        res.render('uploads');
    })
    .post(function(req, res){
        //how to wait here for the file to upload?
    });

While I am aware of onParseEnd, but I don't know how to implement it, so that I have at least some kind of information about the upload process being finished.

4

4 Answers

5
votes

Multer is part of the router chain. This means that express will execute multer first, and only once multer has completed parsing the form it will continue execution to your .post() handler. The warning on the page is meant for accessing req.body from multer callbacks, like onFileUploadData() and similar. Therefore, the order of execution is:

  • onParseStart
  • onFileUploadStart/onFileUploadData...
  • onFileUploadComplete
  • onParseEnd
  • your .post() handler
2
votes

If I understand the documentation correctly the warning is only applicable to the event handlers you can pass to multer itself. When the request reaches your handler multer is already done and all files are already uploaded.

The problem exists for example in the rename event which you already use, but this function actually receives four arguments fieldname, filename, req, res. That means you have access to the request before it is fully parsed.

2
votes

As of 2018, onFileUploadComplete(file, req, res) is no longer part of multer.

0
votes

You can know it easily, there is option available in multer called

  • onFileUploadComplete(file, req, res)

You can use this and send response from here.

https://github.com/expressjs/multer#options

    app.use(multer({
    dest: path.join(__dirname, '../uploads/fullsize'),
    rename: function (fieldname, filename) {
        return filename.replace(/\W+/g, '-').toLowerCase();
    },
    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
    }

}));