在Express JS中使用Multer在扩展的基础上过滤文件

如问题标题所解释的,我需要根据文件扩展名来过滤上传的文件。 于是,我浏览了官方文档并search了这个网站。

我所试过的

我尝试过遇到的解决scheme。 文件正在成功上传,但问题是如何过滤文件。 目前我的Router.js文件看起来像这样。

Router.JS

var multer = require('multer'); var storage = multer.diskStorage({ //multers disk storage settings destination: function (req, file, cb) { cb(null, './public/uploads/') }, limits:{ files: 1, fileSize: 1024 * 1024 }, filename: function (req, file, cb) { var datetimestamp = Date.now(); cb(null, file.fieldname + '-' + datetimestamp + '.' + file.originalname.split('.')[file.originalname.split('.').length -1]) }, onFileUploadStart: function(file) { console.log("Inside uploads"); if (file.mimetype == 'image/jpg' || file.mimetype == 'image/jpeg' || file.mimetype == 'image/png') { return true; } else { return false; } } }); var upload = multer({ //multer settings storage: storage }).single('profilepic'); router.post('/profile', function(req, res){ upload(req,res,function(err){ if(err) { console.log(err); } else { console.log("Image was uploaded"); } }); }); 

我尝试在onFileUploadStart回显一些内容,以检查是否进入该函数。 而事实并非如此。 除了onFileUploadStart之外,我也试过这个链接中提到的fileFilter ,但是没有什么帮助。 任何build议如何解决这个问题? 提前致谢。

一个使用multer的例子:

 var storage = multer.diskStorage({ //multers disk storage settings destination: function (req, file, cb) { cb(null, './public/uploads/') }, filename: function (req, file, cb) { var datetimestamp = Date.now(); cb(null, file.fieldname + '-' + datetimestamp + '.' + file.originalname.split('.')[file.originalname.split('.').length -1]) } }); var upload = multer({ //multer settings storage: storage, fileFilter: function (req, file, callback) { var ext = path.extname(file.originalname); if(ext !== '.png' && ext !== '.jpg' && ext !== '.gif' && ext !== '.jpeg') { return callback(new Error('Only images are allowed')) } callback(null, true) }, limits:{ fileSize: 1024 * 1024 } }).single('profilepic'); 

摘自Node.js – file upload 。 原作者是冰人和米哈伊尔 。 可以在贡献者页面上find归因详情。 该源代码是根据CC BY-SA 3.0获得许可的,可以在文档存档中find。 参考主题ID:4080和示例ID:14210。

如果你习惯于web开发,你可以在前端进行validation,而不是传给后端,你可以试试:

 var file = files[0]; var imageType = /image.*/; if (!file.type.match(imageType)) { // do something }