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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 00:10:41