You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 06:15:30