使用Express.js的Multer存储表单图片遇ENOENT错误求助
解决Multer上传图片时的ENOENT目录不存在错误
错误原因
错误信息明确提示找不到目标目录:
Error: ENOENT: 没有该文件或目录,打开 'C:\Users\Dunia Dunia\Desktop\Coding my career\Nodejs\Full-Recap\images\2023-01-05T22:58:24.937Z-firstpic.jpg'
Multer的diskStorage不会自动创建destination指定的目录,当项目根目录下未手动创建images文件夹时,就会触发该错误。
解决方案
方案1:手动创建目录
直接在项目根目录下新建名为images的文件夹,重启服务后重新测试上传功能即可。
方案2:代码自动创建目录
通过Node.js的fs模块在代码中检查并自动创建目录,避免手动操作的麻烦。修改后的App.js代码如下:
const multer = require('multer'); const path = require('path'); const fs = require('fs'); // 引入fs模块 const fileStorage = multer.diskStorage({ destination: (req, file, cb) => { const imageDir = path.join(__dirname, 'images'); // 检查目录是否存在,不存在则递归创建 fs.access(imageDir, (err) => { if (err) { return fs.mkdir(imageDir, { recursive: true }, (mkdirErr) => { cb(mkdirErr, imageDir); }); } cb(null, imageDir); }); }, filename: (req, file, cb) => { // Windows系统下文件名不能包含冒号,替换ISO日期中的冒号为横杠 const safeFilename = new Date().toISOString().replace(/:/g, '-') + '-' + file.originalname; cb(null, safeFilename); } }); app.use(multer({storage: fileStorage}).single('image'));
额外注意事项
Windows系统中文件名不允许包含:字符,而new Date().toISOString()生成的字符串会带有冒号,因此需要将其替换为合法字符(比如横杠),否则后续访问上传的文件时可能会出现异常。
验证配置正确性
你的EJS表单配置是正确的:
- 表单设置了
enctype="multipart/form-data",支持文件上传 - 文件输入框的
name="image"与Multer的single('image')参数匹配
内容的提问来源于stack exchange,提问作者Dunia
相关产品推荐
相关产品推荐

