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
相关产品推荐
相关产品推荐

