6

我正在使用 Multer 模块进行文件上传。虽然一切正常,但在他们的 github 页面末尾有一条警告,上面写着:“警告:文件上传完成后 req.body 已完全解析。过早访问 req.body 可能会导致错误。”

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

应用程序.js:

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

上传.js:

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

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

4

4 回答 4

6

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

  • onParseStart
  • onFileUploadStart/onFileUploadData...
  • onFileUploadComplete
  • 解析结束
  • 你的.post()处理程序
于 2015-05-26T12:19:38.930 回答
3

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

于 2018-08-22T02:17:37.530 回答
2

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

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

于 2015-05-08T13:05:11.557 回答
-1

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

  • onFileUploadComplete(文件、请求、资源)

您可以使用它并从此处发送响应。

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
    }

}));
于 2015-04-05T07:37:00.887 回答