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

使用multer上传文件到服务器时报Error: ENOENT无此文件或目录错误

报错原因
  • 最直接的触发因素:你配置的存储目标路径为相对路径images,multer 本身不负责自动创建目标存储目录,如果项目运行时的工作目录下不存在名为images的文件夹,写入文件时就会抛出Error: ENOENT: no such file or directory错误。
  • 潜在兼容问题:生成文件名时使用的new Date().toISOString()会返回带:的时间字符串(例:2024-05-20T09:15:30.123Z),Windows 系统禁止文件名包含冒号字符,该问题也会导致文件写入失败抛出同类错误。
  • 额外隐患:使用相对路径指定存储目录时,如果服务启动的工作目录和项目根目录不一致(比如从其他目录执行启动脚本),会出现路径匹配偏移,同样会触发找不到目录的错误。
修复步骤
  1. 提前创建存储目录,推荐用 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 });
  1. 调整 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}`);
  }
});
  1. 你原有配置的 multer 中间件代码不需要修改,如果需要通过 HTTP 地址访问上传后的图片,补充静态资源托管配置即可:
// 该配置放在multer中间件注册前后均可
app.use('/images', express.static(IMAGE_UPLOAD_PATH));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:57:12