2014-08-23
今天開始學習Node.js,在寫一個文件上傳的功能時候,調用fs.renameSync方法錯誤
出錯代碼所在如下:
1 function upload(response,request){ 2 console.log("upload called"); 3 var form = new formidable.IncomingForm(); 4 console.log("about to parse"); 5 form.parse(request, function(error, fields, files) { 6 console.log("parsing done"); 7 fs.renameSync(files.upload.path, "./tmp/test.jpg"); 8 response.writeHead(200, {"Content-Type": "text/html"}); 9 response.write("received image:<br/>"); 10 response.write("<img src='/show' />"); 11 response.end(); 12 }); 13 }
大致分析后,預計是因為跨磁盤分區移動或操作文件會有權限問題。
下面提供兩種解決辦法:
方法一:
主要利用fs的createReadStream、createWriteSream和unlinkSync方法
具體代碼如下:
1 function upload(response,request){ 2 console.log("upload called"); 3 var form = new formidable.IncomingForm(); 4 console.log("about to parse"); 5 form.parse(request, function(error, fields, files) { 6 console.log("parsing done");
7 // fs.renameSync(files.upload.path, "./tmp/test.jpg"); 8 var readStream=fs.createReadStream(files.upload.path); 9 var writeStream=fs.createWriteStream("./tmp/test.jpg"); 10 readStream.pipe(writeStream); 11 readStream.on('end',function(){ 12 fs.unlinkSync(files.upload.path); 13 });
14 response.writeHead(200, {"Content-Type": "text/html"}); 15 response.write("received image:<br/>"); 16 response.write("<img src='/show' />"); 17 response.end(); 18 }); 19 }
PS:我用的node版本是0.10.69,如果使用的是0.6以下的版本,可以使用util.pump
相應代碼只需將上面的代碼中readStream.on處改成:(注意引入util模塊)
util.pump(readStream,writeStream, function() { fs.unlinkSync('files.upload.path'); });
方法二:
這種就簡潔很多了
添加一個 form.uploadDir='tmp' 即可(寫一個臨時路徑)
1 function upload(response,request){ 2 console.log("upload called"); 3 var form = new formidable.IncomingForm(); 4 form.uploadDir='tmp'; 5 6 console.log("about to parse"); 7 form.parse(request, function(error, fields, files) { 8 console.log("parsing done"); 9 fs.renameSync(files.upload.path, "./tmp/test.jpg"); 10 response.writeHead(200, {"Content-Type": "text/html"}); 11 response.write("received image:<br/>"); 12 response.write("<img src='/show' />"); 13 response.end(); 14 }); 15 } 16
解決問題后,就可以很開心的繼續我的Node學習了,感覺路還很長啊
PS:附上兩個有關Node文件上傳的帖子,個人覺得挺不錯的,來源都是cnode
