Node.js使用formidable上传文件报错ENOENT:找不到文件或目录
Node.js formidable文件上传ENOENT错误解决
问题详情
我是Node.js初学者,用formidable做文件上传时碰到报错,控制台输出:
[Error: ENOENT: no such file or directory, rename '/var/folders/my/b9y9l2zx583b0sz5zsc63g680000gn/T/ce455bd0f3e8df772aa8aba00' -> 'C:/Users/donlam/desktop/nodejs-uploadtutorial/69.png'] { errno: -2, code: 'ENOENT', syscall: 'rename', path: '/var/folders/my/b9y9l2zx583b0sz5zsc63g680000gn/T/ce455bd0f3e8df772aa8aba00', dest: 'C:/Users/donlam/desktop/nodejs-uploadtutorial/69.png' }
试过重新打开文件夹、删package.json这些方法都没用,发现源文件路径是/var/开头的临时路径,不是我选的上传路径,想问这是不是问题根源?
我的代码如下:
var http = require('http'); var formidable = require('formidable'); var fs = require('fs'); http.createServer(function (req, res) { if (req.url == '/fileupload') { var form = new formidable.IncomingForm(); form.parse(req, function (err, fields, files) { var oldpath = files.filetoupload.filepath; //var oldpath = files.fileupload.path; var newpath = 'C:/Users/donlam/desktop/nodejs-uploadtutorial/' + files.filetoupload.originalFilename; fs.rename(oldpath, newpath, function (err) { if (err) throw err; res.write('File uploaded and moved!'); res.end(); }); }); } else { res.writeHead(200, {'Content-Type': 'text/html'}); res.write('<form action="fileupload" method="post" enctype="multipart/form-data">'); res.write('<input type="file" name="filetoupload"><br>'); res.write('<input type="submit">'); res.write('</form>'); return res.end(); } }).listen(8080);
问题根源及解决办法
报错原因
/var/开头的路径是formidable默认的临时文件存储目录,这是正常流程:formidable会先把上传的文件写到临时文件夹,再由你转移到目标路径。真正的问题是fs.rename()不能跨文件系统移动文件——你的临时文件在类Unix系统的/var/tmp(一个文件系统),目标路径是Windows的C盘(另一个文件系统),这时rename就会触发ENOENT错误。修复方案
用fs.copyFile()复制临时文件到目标路径,再用fs.unlink()删除临时文件,替代原来的fs.rename():
var http = require('http'); var formidable = require('formidable'); var fs = require('fs'); http.createServer(function (req, res) { if (req.url == '/fileupload') { var form = new formidable.IncomingForm(); form.parse(req, function (err, fields, files) { if (err) { res.write('上传出错:' + err.message); return res.end(); } var oldpath = files.filetoupload.filepath; var newpath = 'C:/Users/donlam/desktop/nodejs-uploadtutorial/' + files.filetoupload.originalFilename; const targetDir = 'C:/Users/donlam/desktop/nodejs-uploadtutorial/'; // 先确保目标目录存在,不存在就创建 if (!fs.existsSync(targetDir)) { fs.mkdirSync(targetDir, { recursive: true }); } // 复制文件到目标路径 fs.copyFile(oldpath, newpath, function (err) { if (err) { res.write('文件复制失败:' + err.message); return res.end(); } // 删除临时文件 fs.unlink(oldpath, function (err) { if (err) console.log('删除临时文件失败:', err); res.write('File uploaded and moved!'); res.end(); }); }); }); } else { res.writeHead(200, {'Content-Type': 'text/html'}); res.write('<form action="fileupload" method="post" enctype="multipart/form-data">'); res.write('<input type="file" name="filetoupload"><br>'); res.write('<input type="submit">'); res.write('</form>'); return res.end(); } }).listen(8080);
- 额外注意
如果你的formidable是旧版本,filepath属性可能不存在,需要换成files.filetoupload.path(取消你代码里的注释即可)。
内容的提问来源于stack exchange,提问作者cck1114
相关产品推荐
相关产品推荐

