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

Node.js上传文件报错ENOENT:找不到指定文件或目录

解决Multer上传文件时"No such file or directory"错误

问题描述

尝试上传文件到uploads文件夹时触发ENOENT错误,控制台显示图片上传成功的提示,但接口实际返回500错误。报错日志如下:

POST /auth/register 500 21.023 ms - 260
Error: ENOENT: no such file or directory, open E:\IMPORTANT\INFO-DEV\DEV\ANGULAR NODEJS\API AUTH\uploads\1671534381494.jpeg

使用的Multer配置代码:

const path = require("path");
const multer = require("multer");
const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, "uploads/");
  },
  filename: function (req, file, cb) {
    const extension = path.extname(file.originalname);
    cb(null, Date.now() + extension);
  },
});
const upload = multer({
  storage: storage,
  fileFilter: function (req, file, callback) {
    if (
      file.mimetype == "image/png" ||
      file.mimetype == "image/jpg" ||
      file.mimetype == "image/jpeg"
    ) {
      callback(null, true);
      console.log("Image téléchargé avec succès"); // success message
    } else {
      callback(null, false);
      console.log("Seulement du fichier de type png, jpg ou jpeg"); // error message
    }
  },
  limits: {
    fileSize: 1024 * 1024 * 2,
  },
});

module.exports = upload;

解决方案

1. 核心问题:目标文件夹不存在

Multer不会自动创建存储文件的目标文件夹,必须确保uploads文件夹存在。有两种处理方式:

  • 手动创建文件夹:直接在项目根目录下新建uploads文件夹。
  • 代码自动生成文件夹(推荐):使用Node.js的fs模块在配置中自动创建文件夹,避免手动操作遗漏。修改后的存储配置如下:
const path = require("path");
const multer = require("multer");
const fs = require("fs");

const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    // 生成绝对路径,避免相对路径的不确定性
    const uploadDir = path.join(__dirname, "uploads/");
    // 递归创建文件夹,不存在则自动生成
    fs.mkdirSync(uploadDir, { recursive: true });
    cb(null, uploadDir);
  },
  filename: function (req, file, cb) {
    const extension = path.extname(file.originalname);
    cb(null, Date.now() + extension);
  },
});

2. 修正成功提示的时机

当前代码中,文件过滤通过后立即打印成功提示,但此时文件还未实际写入磁盘,会出现"提示成功但实际报错"的误导。建议将成功提示移到路由处理逻辑中:

// 假设你的路由文件中
router.post("/auth/register", upload.single("avatar"), (req, res) => {
  // 文件上传成功后再打印提示
  console.log("Image téléchargé avec succès");
  // 后续的注册业务逻辑
  res.status(200).json({ message: "注册完成" });
});

同时删除fileFilter中的console.log("Image téléchargé avec succès")语句。

内容的提问来源于stack exchange,提问作者Stéphane Konan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 17:15:27