解決Node.js調用fs.renameSync報錯的問題(Error: EXDEV, cross-device link not permitted)


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM