上传文件,修改文件名称出错
发布于 13 年前 作者 sottish 6664 次浏览 最后一次编辑是 8 年前

下面代码执行的时候,抛出异常,不解。。代码是按照Node入门照写的,之前在Linux下是可以正常执行的。昨天是些了Windows上却行不通。

form.parse(request, function(error, fields, files) {
console.log('parsing done');

fs.renameSync(files.upload.path, 'c:/tmp/test.png');
response.writeHead(200, {'Content-Type': 'text/html'});
response.write('received image:<br/>');
response.write('<img src="/show" />');
response.end();
});

异常信息 enter image description here

17 回复

那个目录的斜杠看着不顺眼… 毕竟 Linux 和 Windows 不同的写法, 会不会这个问题
参考… http://stackoverflow.com/questions/8921732/nodejs-async-file-read-problems

问题:

  • 1、你的Node.js是哪个版本的?

  • 2、你确定那个文件确实存在么?

  • 3、用将fs.renameSync()改用fs.rename()可以正常么?

  • 1、有可能是那个版本的Node.js的Bug

  • 2、有可能form.parse()时,不能成功保存上传的文件(files.upload.path),如果那个文件都不存在,那肯定就报错了

神那,拜托你们看看异常在说好不好。

看过了,和我的不太一致,我的这个里面抛出的异常是在于,文件上传到后台之后获取文件的时候,文件没有了后缀名,然后把文件当成文件路径了。不解。。。

奇怪,windows的路径确实喊起来比较怪:

fs.renameSync(files.upload.path, 'c:\\tmp\\test.png');

这样子试试,理由是fs.rename不能提供跨磁盘的rename,如果是文件路径不准确(看起来是C盘,实际被识别成相对路径~),早期版本的node直接抛出文件找不到,之前提过一个issue,新版本已经增加了一个新的错误描述。

所以2楼问 node 的版本还是有道理的。

是不是有其他的错误可能,就不知道了~

@sottish 楼上想多了, 我只是不解那个路径的写法想问楼主确认下,
Linux 是用/分割没错, windows 我没玩过, 但之前看到是用\\分割(比如链接里)
还是按 #2 楼 #3 楼大侠说的确认一遍咯

@sottish 异常不是No such file or directory么?

神呐,出了问题,应该报告一下你所用的Node.js版本。。。

@leizongmin 版本是0.6.14 这个还真不了解,新手,有冒犯之处还请多多原谅。

@sottish 这段代码没问题: formidable 1.0.9Windows 7系统上的Node.js v0.6.11v0.6.14v0.6.15 上运行均能正常。

var http = require('http');
var formidable = require('formidable');
var fs = require('fs');

var server = http.createServer(function (request, response) {
  if (/POST|PUT/img.test(request.method)) {
    var form = new formidable();
    form.parse(request, function(error, fields, files) {
      console.log('parsing done', error, fields, files);
      
      fs.renameSync(files.upload.path, 'c:/tmp/test.png');
      response.writeHead(200, {'Content-Type': 'text/html'});
      response.write('received image:<br/>');
      response.write('<img src="/show" />');
      response.end();
    });
  }
  else if (request.url == '/show') {
    fs.readFile('c:/tmp/test.png', function (err, data) {
      if (err)
        console.log(err.stack);
      response.end(data);
    });
  }
  else {
    response.end('请上传一个文件');
  }
});
server.listen(80);

@jiyinyiyong 在Windows上用/和\分割貌似都可以的

@leizongmin 终于还是扭过来… 不过 Windows 那个终端实在无语, 一点都不好玩…

@leizongmin 我这边代码是这么写的,和书上差不多把,如果用renameSync的话,会抛出以上我提出的异常,如果用rename的把,虽然不会抛出异常,但是代码执行过后,图片也未上传。

 function upload(request, response) {
 console.log('request handler \'upload\' was called.');

 var form = new formidable.IncomingForm();
 console.log('about to parse');
 form.parse(request, function(error, fields, files) {
   console.log('parsing done');

  	fs.rename(files.upload.path, 'd:\\tmp\\test.png');
   response.writeHead(200, {'Content-Type': 'text/html'});
   response.write('received image:<br/>');
   response.write('<img src="/show" />');
   response.end();
 });

}

‘c:\tmp\test.png’ 字符串路径是需要这样写。
实际上,windows的path是c:\tmp\test.png的,双斜杠是因为字符串转义

fs.rename()不能跨磁盘移动文件 renameSync 不能创建新目录

ls正解,renameSync不能创建新目录,如果手动在c盘创建一个tmp目录,就ok了。

回到顶部