Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 601|回复: 0

解决Node.js调用fs.renameSync报错的问题(Error: EXDEV, cross-device link not permitted)

[复制链接]
  • TA的每日心情
    奋斗
    4 天前
  • 签到天数: 802 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726006
    发表于 2021-6-16 09:31:24 | 显示全部楼层 |阅读模式

    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

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-11-15 02:16 , Processed in 0.179127 second(s), 30 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表