NPM Multer,替代 onFileUploadComplete
NPM Multer, alternative to onFileUploadComplete
我正在尝试将表单信息与上传文件一起保存到猫鼬数据库中。我尝试了各种示例,但似乎 'onFileUploadComplete' 选项已被删除。这是下面的代码:
router.post('/info', function(req, res, next){
multer({ storage:
multer.diskStorage({
destination: function(req, file, callback){
var path = "./public/assets";
switch(req.body.type)
{
case 'link': path += '/link'; break;
case 'PDF': path += '/PDF'; break;
case 'video': path += '/video'; break;
case 'audio': path += '/audio'; break;
case 'image': path += '/image/' + req.body.folder; break;
}
callback(null, path);
},
filename: function(req, file, callback){
callback(null, file.originalname);
}
}),
onFileUploadComplete: function(req, file, callback){
var asset = new Asset(req.body);
asset.save(function(err, asset){
if(err)
return next(err);
return next();
});
}
}).single('file')(req, res, function(err){
if(err)
return res.send("Err: "+ err);
res.render('uploads', {authorised: true});
});
});
有没有其他方法可以将文件上传到指定位置,并将表单信息(req.body)保存到数据库中。
感谢任何帮助,
谢谢
您可以通过file.stream
访问可读文件流。因此,您可以 file.stream.on('end', ...)
知道文件何时完成 读取 。如果你想知道文件是否真的 写入磁盘 ,你需要做一些更 hacky 的事情,比如:file.stream._readableState.pipes.on('finish', ...)
.
但是,如果您想在文件完成后存储 req.body
,为什么不直接在路由处理程序中这样做,或者编写一个自定义的通用中间件来包装 multer
中间件在单个中间件中完成这两项工作。例如:
function myUpload(multUpload) {
return function(req, res, next) {
multUpload(req, res, function(err) {
if (err) return next(err);
// Save `req.body` to database here, then call `next()`
});
};
}
并像这样使用它:
// Here `upload === multer({ ... })`
router.post('/info', myUpload(upload.single('file')), function(req, res, next) {
if (err)
return res.send("Err: "+ err);
res.render('uploads', {authorised: true});
});
我正在尝试将表单信息与上传文件一起保存到猫鼬数据库中。我尝试了各种示例,但似乎 'onFileUploadComplete' 选项已被删除。这是下面的代码:
router.post('/info', function(req, res, next){
multer({ storage:
multer.diskStorage({
destination: function(req, file, callback){
var path = "./public/assets";
switch(req.body.type)
{
case 'link': path += '/link'; break;
case 'PDF': path += '/PDF'; break;
case 'video': path += '/video'; break;
case 'audio': path += '/audio'; break;
case 'image': path += '/image/' + req.body.folder; break;
}
callback(null, path);
},
filename: function(req, file, callback){
callback(null, file.originalname);
}
}),
onFileUploadComplete: function(req, file, callback){
var asset = new Asset(req.body);
asset.save(function(err, asset){
if(err)
return next(err);
return next();
});
}
}).single('file')(req, res, function(err){
if(err)
return res.send("Err: "+ err);
res.render('uploads', {authorised: true});
});
});
有没有其他方法可以将文件上传到指定位置,并将表单信息(req.body)保存到数据库中。
感谢任何帮助, 谢谢
您可以通过file.stream
访问可读文件流。因此,您可以 file.stream.on('end', ...)
知道文件何时完成 读取 。如果你想知道文件是否真的 写入磁盘 ,你需要做一些更 hacky 的事情,比如:file.stream._readableState.pipes.on('finish', ...)
.
但是,如果您想在文件完成后存储 req.body
,为什么不直接在路由处理程序中这样做,或者编写一个自定义的通用中间件来包装 multer
中间件在单个中间件中完成这两项工作。例如:
function myUpload(multUpload) {
return function(req, res, next) {
multUpload(req, res, function(err) {
if (err) return next(err);
// Save `req.body` to database here, then call `next()`
});
};
}
并像这样使用它:
// Here `upload === multer({ ... })`
router.post('/info', myUpload(upload.single('file')), function(req, res, next) {
if (err)
return res.send("Err: "+ err);
res.render('uploads', {authorised: true});
});