Express.js and multer: 如何知道文件何时全部上传?
Express.js and multer: how to know when the files are all uploaded?
我正在使用 Multer 模块上传文件。虽然一切正常,但在他们的 github 页面末尾有一条警告,内容如下:
"WARNING: req.body is fully parsed after file uploads have finished. Accessing req.body prematurely may cause errors."
这让我很担心。我只是找不到让 .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 中有一个选项叫做
- 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
}
}));
如果我正确理解文档,警告仅适用于您可以传递给 multer 本身的事件处理程序。当请求到达您的处理程序时,multer 已经完成并且所有文件都已上传。
问题存在于您已经使用的 rename
事件中,但此函数实际上接收四个参数 fieldname, filename, req, res
。这意味着您可以在完全解析之前访问请求。
Multer 是路由器链的一部分。这意味着 express 将首先执行 multer,只有当 multer 完成对表单的解析后,它才会继续执行到您的 .post()
处理程序。页面上的警告用于从多个回调访问 req.body
,例如 onFileUploadData()
和类似的回调。因此,执行顺序为:
- onParseStart
- onFileUploadStart/onFileUploadData...
- onFileUploadComplete
- onParseEnd
- 您的
.post()
处理程序
自 2018 年起,onFileUploadComplete(file, req, res) 不再是 multer 的一部分。
我正在使用 Multer 模块上传文件。虽然一切正常,但在他们的 github 页面末尾有一条警告,内容如下: "WARNING: req.body is fully parsed after file uploads have finished. Accessing req.body prematurely may cause errors."
这让我很担心。我只是找不到让 .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 中有一个选项叫做
- 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
}
}));
如果我正确理解文档,警告仅适用于您可以传递给 multer 本身的事件处理程序。当请求到达您的处理程序时,multer 已经完成并且所有文件都已上传。
问题存在于您已经使用的 rename
事件中,但此函数实际上接收四个参数 fieldname, filename, req, res
。这意味着您可以在完全解析之前访问请求。
Multer 是路由器链的一部分。这意味着 express 将首先执行 multer,只有当 multer 完成对表单的解析后,它才会继续执行到您的 .post()
处理程序。页面上的警告用于从多个回调访问 req.body
,例如 onFileUploadData()
和类似的回调。因此,执行顺序为:
- onParseStart
- onFileUploadStart/onFileUploadData...
- onFileUploadComplete
- onParseEnd
- 您的
.post()
处理程序
自 2018 年起,onFileUploadComplete(file, req, res) 不再是 multer 的一部分。