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

Node.js中如何通过Multer在图片上传前获取尺寸并拦截小图?

如何在Node.js中用Multer在图片上传前校验尺寸?

当然可以实现!你完全可以借助Multer配合图片处理的npm包,在图片还没完全写入磁盘前就校验尺寸,不符合要求直接终止上传,完美解决你的需求。

所需依赖

首先安装两个核心包:

  • multer:处理表单文件上传的核心工具
  • sharp:高性能的图片处理库,用来快速读取图片元数据(包括尺寸)

执行安装命令:

npm install multer sharp

核心实现思路

利用Multer的fileFilter钩子,结合sharp读取图片的buffer数据,在文件被正式存储前完成尺寸校验:

  1. 先校验文件类型,确保是图片格式
  2. 从图片buffer中读取宽高信息
  3. 校验宽高是否都≥300px,不符合则拒绝上传
  4. 校验通过后,再将图片写入指定目录

完整代码示例

const express = require('express');
const multer = require('multer');
const sharp = require('sharp');
const fs = require('fs').promises;
const app = express();

// 配置Multer使用内存存储(避免先写入临时文件再删除的冗余操作)
const storage = multer.memoryStorage();
const upload = multer({
  storage: storage,
  // 限制文件大小,避免大图片占用过多内存(这里限制为5MB)
  limits: { fileSize: 5 * 1024 * 1024 },
  fileFilter: async (req, file, cb) => {
    // 第一步:校验文件类型
    if (!file.mimetype.startsWith('image/')) {
      return cb(new Error('仅支持上传图片文件!'), false);
    }

    try {
      // 第二步:从buffer读取图片尺寸元数据
      const metadata = await sharp(file.buffer).metadata();
      const { width, height } = metadata;

      // 第三步:校验尺寸要求
      if (width < 300 || height < 300) {
        return cb(new Error('图片宽度和高度必须至少为300px!'), false);
      }

      // 校验通过,允许继续上传
      cb(null, true);
    } catch (err) {
      cb(new Error('读取图片尺寸失败:' + err.message), false);
    }
  }
});

// 处理上传请求的路由
app.post('/upload', upload.single('image'), async (req, res) => {
  try {
    // 将校验通过的图片buffer写入指定目录(比如./uploads)
    await fs.access('./uploads').catch(() => fs.mkdir('./uploads')); // 确保目录存在
    await sharp(req.file.buffer).toFile(`./uploads/${req.file.originalname}`);
    res.status(200).json({ message: '图片上传成功!' });
  } catch (err) {
    res.status(500).json({ error: '保存图片失败:' + err.message });
  }
});

app.listen(3000, () => {
  console.log('服务器运行在http://localhost:3000');
});

额外提示

  • 如果担心内存存储的问题,也可以用Multer的磁盘存储,但需要在校验不通过时手动删除临时文件,相对麻烦一些
  • 可以根据需求调整文件大小限制和尺寸阈值
  • 若不想使用sharp,也可以用jimp替代,但sharp的性能更优,适合处理大量图片上传场景

内容的提问来源于stack exchange,提问作者palmtreesnative

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:59:40