下面代码执行的时候,抛出异常,不解。。代码是按照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();
});
异常信息
问题:
-
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 异常不是No such file or directory么?
神呐,出了问题,应该报告一下你所用的Node.js版本。。。
@leizongmin 版本是0.6.14 这个还真不了解,新手,有冒犯之处还请多多原谅。
@sottish 这段代码没问题: formidable 1.0.9
在Windows 7系统上的Node.js v0.6.11
、 v0.6.14
、 v0.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 我这边代码是这么写的,和书上差不多把,如果用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了。