使用Node.js+Express API上传图片时如何校验图片格式
Express图片上传:添加扩展名验证功能
针对你需要限制图片只能是jpg、png、gif的需求,直接通过multer的fileFilter配置就能实现,同时整理你现有代码里的冗余问题,修改后的完整代码如下:
// 按需引入模块,避免重复引入 var sizeOf = require('image-size'); var multer = require('multer'); var storage = multer.diskStorage({ destination: function (req, file, callback) { callback(null, './uploads'); }, filename: function (req, file, callback) { const originalname = file.originalname; const fileExt = originalname.split(".").pop().toLowerCase(); // 转小写兼容大小写扩展名 const exactName = originalname.split(".").slice(0, -1).join("."); console.log("mimetype is " + file.mimetype); callback(null, exactName + "-" + Date.now().toString() + "." + fileExt); }, }); // 配置文件过滤规则,验证扩展名与MIME类型 var upload = multer({ storage: storage, fileFilter: function (req, file, cb) { // 定义允许的扩展名和MIME类型 const allowedExts = ['.jpg', '.jpeg', '.png', '.gif']; const allowedMimes = ['image/jpeg', 'image/png', 'image/gif']; const fileExt = "." + file.originalname.split(".").pop().toLowerCase(); // 双重验证,避免扩展名篡改的情况 if (allowedExts.includes(fileExt) && allowedMimes.includes(file.mimetype)) { cb(null, true); // 允许上传 } else { cb(new Error('只允许上传jpg、png、gif格式的图片')); // 返回错误提示 } } }).single('userPhoto'); const uploadavatar = function (req, res) { upload(req, res, function(err) { if(err) { // 区分错误类型,返回精准提示 if (err.message.includes('只允许上传')) { return res.end(err.message); } return res.end("Error uploading file: " + err); } res.end("File is uploaded"); }); };
关键修改说明:
- 清理冗余代码:移除重复的
sizeOf模块引入,若不需要图片尺寸验证可直接删除该引入 - 添加文件过滤逻辑:通过
fileFilter在文件存储前拦截不符合要求的文件,同时验证扩展名和MIME类型,避免仅靠扩展名判断的漏洞 - 兼容大小写:将扩展名转为小写,避免
.JPG、.PNG这类大写扩展名被误判 - 优化错误提示:区分错误类型,返回更明确的提示信息,而非通用错误
内容的提问来源于stack exchange,提问作者prabhat mohal
相关产品推荐
相关产品推荐

