使用Express-fileupload上传文件时遇ENOENT目录不存在错误 - Node.js
解决Express-fileupload上传PDF时的ENOENT目录不存在错误
嘿,我看你用Express-fileupload处理文件上传时碰到了ENOENT: no such file or directory的错误,这个问题其实挺常见的,主要是两个核心点没处理到位:目标目录不存在,或者路径写法出错了。咱们一步步来搞定它:
1. 先确保目标目录存在
Node不会自动帮你创建多级目录,所以如果public/files/CLPs这个路径里的任何一级目录还没创建,调用.mv()方法时肯定会报错。你可以用Node内置的fs模块递归创建目录,这样不管目录是否存在都能正常工作:
const fs = require('fs'); const path = require('path'); // 基于项目根目录拼接目标目录路径 const targetDir = path.join(__dirname, 'public', 'files', 'CLPs'); // recursive: true 表示自动创建所有不存在的父级目录 fs.mkdirSync(targetDir, { recursive: true });
2. 修正文件路径的写法
你现在用的/public/files/CLPs/minor_CLP.pdf是系统根目录的绝对路径,不是你项目里的public文件夹!这就好比你在电脑里找C:\public\...,但你的项目实际在C:\projects\my-app\public\...,肯定找不到目标位置。
正确的做法是用path模块拼接基于项目根目录的路径,这样不管在Windows还是Linux系统下都不会出错:
app.post('/uploadCLP', isLoggedIn, function(req, res) { const communityID = req.user.communityID; console.log(req.files); // 先拿到上传的文件(替换成你前端表单里的文件字段名) const uploadedFile = req.files.clpFile; // 你要设置的可查询文件名 const targetFileName = 'minor_CLP.pdf'; // 拼接正确的目标文件路径 const targetFilePath = path.join(__dirname, 'public', 'files', 'CLPs', targetFileName); // 保险起见,再次确保目录存在(哪怕之前创建过,重复执行也不会有问题) const targetDir = path.dirname(targetFilePath); fs.mkdirSync(targetDir, { recursive: true }); // 移动文件 uploadedFile.mv(targetFilePath, function(err) { if (err) { console.error('移动文件出错:', err); return res.status(500).send('文件上传失败,请重试'); } // 这里执行把文件名存入SQL表的逻辑 // 比如用你的数据库客户端执行INSERT语句,把targetFileName和communityID存进去 // 示例:db.query('INSERT INTO clp_files (file_name, community_id) VALUES (?, ?)', [targetFileName, communityID], ...) res.send('文件上传成功,已记录文件名到数据库'); }); });
3. 额外要注意的小细节
- 检查目录权限:确保Node进程有读写
public/files/CLPs目录的权限,尤其是部署到Linux服务器时,可能需要调整目录的所有者或权限(比如用chmod或chown命令)。 - 避免文件名冲突:如果需要处理多用户上传,建议动态生成文件名,比如结合社区ID和时间戳:
${communityID}_${Date.now()}_CLP.pdf,防止同名文件覆盖。
内容的提问来源于stack exchange,提问作者Blake Lewis
相关产品推荐
相关产品推荐

