使用multer上传文件到服务器时报Error: ENOENT无此文件或目录错误
报错原因
- 最直接的触发因素:你配置的存储目标路径为相对路径
images,multer 本身不负责自动创建目标存储目录,如果项目运行时的工作目录下不存在名为images的文件夹,写入文件时就会抛出Error: ENOENT: no such file or directory错误。 - 潜在兼容问题:生成文件名时使用的
new Date().toISOString()会返回带:的时间字符串(例:2024-05-20T09:15:30.123Z),Windows 系统禁止文件名包含冒号字符,该问题也会导致文件写入失败抛出同类错误。 - 额外隐患:使用相对路径指定存储目录时,如果服务启动的工作目录和项目根目录不一致(比如从其他目录执行启动脚本),会出现路径匹配偏移,同样会触发找不到目录的错误。
修复步骤
- 提前创建存储目录,推荐用 Node 内置模块在服务启动时自动检查并创建目录,避免手动创建遗漏:
const fs = require('fs'); const path = require('path'); // 拼接images目录的绝对路径,彻底规避相对路径的工作目录偏移问题 const IMAGE_UPLOAD_PATH = path.join(__dirname, 'images'); // 递归创建目录,目录已存在时不会抛出错误 fs.mkdirSync(IMAGE_UPLOAD_PATH, { recursive: true });
- 调整 multer 的 diskStorage 配置,使用提前定义好的绝对路径,同时替换文件名中的非法字符:
const fileStorage = multer.diskStorage({ destination: (req, file, cb) => { cb(null, IMAGE_UPLOAD_PATH); }, filename: (req, file, cb) => { // 替换时间字符串中的冒号为短横,兼容所有操作系统的文件名规则 const safeTimeStr = new Date().toISOString().replace(/:/g, '-'); cb(null, `${safeTimeStr}-${file.originalname}`); } });
- 你原有配置的 multer 中间件代码不需要修改,如果需要通过 HTTP 地址访问上传后的图片,补充静态资源托管配置即可:
// 该配置放在multer中间件注册前后均可 app.use('/images', express.static(IMAGE_UPLOAD_PATH));
内容的提问来源于stack exchange,提问作者yonatan Cohen
相关产品推荐
相关产品推荐

