使用Postman上传图片到Cloudinary出现ENOENT无此文件或目录错误
错误原因
- 核心原因:Multer 的
diskStorage不会自动创建不存在的目标目录。你代码中指定的存储路径为./storage/media,但当前项目根目录下不存在对应层级的文件夹,写入文件时就会触发ENOENT: no such file or directory报错。 - 路径不匹配问题:你的预期是将文件保存到
public/upload_files文件夹,但代码里的目标路径配置和预期不符,哪怕目录存在,文件也会存储到错误位置。
修复方案
首先确保你已经引入了所需的核心模块:
const multer = require('multer'); const path = require('path'); const fs = require('fs');
修改后的完整 Multer 配置如下,会自动创建目标目录、修正存储路径,同时补充了更合理的校验规则:
const storage = multer.diskStorage({ destination: function (req, file, cb) { // 拼接绝对路径,避免跨平台路径兼容问题 const uploadDir = path.resolve(__dirname, './public/upload_files'); // 递归创建目录,父目录不存在时也会自动创建 fs.mkdirSync(uploadDir, { recursive: true }); cb(null, uploadDir); }, filename: function (req, file, cb) { cb(null, Date.now() + path.extname(file.originalname)); }, }); const filefilter = (req, file, cb) => { // 补充文件类型校验,避免恶意文件上传 const allowedImageTypes = ['image/jpeg', 'image/png', 'image/gif']; if (allowedImageTypes.includes(file.mimetype)) { cb(null, true); } else { cb(new Error('仅支持上传jpg、png、gif格式的图片'), false); } }; const upload = multer({ storage: storage, // 单文件上传用fileSize限制单文件大小,比fieldSize更贴合需求 limits: { fileSize: 10 * 1024 * 1024 }, fileFilter: filefilter, });
额外注意事项
- 配置接口路由时,确保你使用了正确的 Multer 中间件,单文件上传对应
upload.single('表单字段名'),多文件上传对应upload.array('表单字段名', 最大数量),Postman 上传时的表单字段名要和代码配置保持一致。 - 如果项目有静态资源托管规则,确保
public/upload_files路径已经被配置为静态资源目录,后续才能正常访问上传后的图片。
内容的提问来源于stack exchange,提问作者Oden
相关产品推荐
相关产品推荐

