Express.js和multer:如何知道文件何时全部上传

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

本文关键字:何时 文件 全部 何知道 js multer Express      更新时间:2023-09-26

我使用Multer模块上传文件。虽然一切正常,但他们的github页面末尾有一条警告,内容如下:"警告:文件上传完成后,req.body将被完全解析。过早访问req.body可能会导致错误。"

这让我很担心。我只是找不到一种方法让.post中间件知道文件何时上传,req.body何时可以使用。这是我的代码:

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?
    });

虽然我知道onParseEnd,但我不知道如何实现它,所以我至少有一些关于正在完成的上传过程的信息。

Multer是路由器链的一部分。这意味着express将首先执行multer,只有在multer完成对表单的解析后,它才会继续执行到您的.post()处理程序。页面上的警告用于从多个回调访问req.body,如onFileUploadData()等。因此,执行顺序为:

  • onParseStart
  • onFileUploadStart/onFileUploadData
  • onFileUploadComplete
  • onParseEnd
  • 您的.post()处理程序

如果我正确理解文档,则警告仅适用于可以传递给multer本身的事件处理程序。当请求到达处理程序时,multer已经完成,所有文件都已经上传。

例如,问题存在于您已经使用的rename事件中,但此函数实际上接收了四个参数fieldname, filename, req, res。这意味着在完全解析请求之前,您可以访问该请求。

自2018年起,onFileUploadComplete(file,req,res)不再是multer的一部分。

你可以很容易地知道,multer中有一个选项叫做

  • onFileUploadComplete(文件,请求,res)

您可以使用它并从这里发送响应。

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
    }
}));