如何使用Multer实现图片大小(≤1MB)与格式(jpg/jpeg/png)验证
Multer图片上传验证实现方案
1. 更新Multer存储配置文件
在你的上传配置文件中,新增文件格式校验和大小限制逻辑,修改后代码如下:
const multer = require("multer"); const path = require("path"); const shortid = require("shortid"); const diskStorage = multer.diskStorage({ destination: (req, file, cb) =>{ cb(null, 'imagens') }, filename: (req, file, cb) =>{ cb(null, Date.now() + shortid.generate() + path.extname(file.originalname)); } }); // 图片格式验证:仅允许jpg/jpeg/png const fileFilter = (req, file, cb) => { const allowedExtensions = ['.jpg', '.jpeg', '.png']; const fileExt = path.extname(file.originalname).toLowerCase(); if (allowedExtensions.includes(fileExt)) { cb(null, true); } else { cb(new Error("仅允许上传.jpg、.jpeg、.png格式的图片")); } }; // 图片大小限制:1MB(1024*1024字节) const limits = { fileSize: 1024 * 1024 }; module.exports = { storage: diskStorage, fileFilter, limits };
2. 修改路由处理逻辑
更新路由中的Multer初始化方式,并添加错误捕获,统一处理各类验证失败情况:
const uploadConfig = require("../classes/uploadImagem"); const multer = require("multer"); const upload = multer(uploadConfig); router.post("/criarconta", async(req, res) =>{ try { // 包装Multer中间件,捕获验证错误 await new Promise((resolve, reject) => { upload.fields([{ name: "photos" }])(req, res, (err) => { err ? reject(err) : resolve(); }); }); let files = []; if (req.files?.photos) { files = req.files.photos; } let photos = []; if (files.length > 0) { files.forEach((photo, i) => { photos[i] = photo.path; }); } // 单图片限制校验 if (files.length > 1) { return res.status(400).json({ erro: "Não é permitido o upload de mais de 1 imagem!" }); } return res.status(200).json({ erro: null, foto: photos }); } catch (err) { return res.status(400).json({ erro: err.message }); } });
核心说明
- 格式验证通过
fileFilter实现,在文件存储前校验扩展名,不符合规则直接抛出错误 - 大小限制通过
limits.fileSize设置,超过1MB时Multer自动抛出错误 - 用Promise包装Multer中间件,配合
async/await捕获所有验证错误,统一返回JSON格式的错误提示
内容的提问来源于stack exchange,提问作者Henrique
相关产品推荐
相关产品推荐

