Node.js中如何通过Multer在图片上传前获取尺寸并拦截小图?
如何在Node.js中用Multer在图片上传前校验尺寸?
当然可以实现!你完全可以借助Multer配合图片处理的npm包,在图片还没完全写入磁盘前就校验尺寸,不符合要求直接终止上传,完美解决你的需求。
所需依赖
首先安装两个核心包:
multer:处理表单文件上传的核心工具sharp:高性能的图片处理库,用来快速读取图片元数据(包括尺寸)
执行安装命令:
npm install multer sharp
核心实现思路
利用Multer的fileFilter钩子,结合sharp读取图片的buffer数据,在文件被正式存储前完成尺寸校验:
- 先校验文件类型,确保是图片格式
- 从图片buffer中读取宽高信息
- 校验宽高是否都≥300px,不符合则拒绝上传
- 校验通过后,再将图片写入指定目录
完整代码示例
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
相关产品推荐
相关产品推荐

