Express.js and multer: how to know when the files are all uploaded?

一笑奈何 提交于 2019-12-01 03:05:58

问题


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.


回答1:


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:


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.




回答3:


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




回答4:


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
    }

}));


来源:https://stackoverflow.com/questions/29452651/express-js-and-multer-how-to-know-when-the-files-are-all-uploaded

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!