解决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

时间: 2024-10-10 00:47:08

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

Node.js使用fs.renameSync报cross-device link not permitted错误

在Node.js中,我们可以使用formidable模块来轻松地实现文件上传功能,代码如下: var Q = require('q'); var util = require('util'); var fs = require('fs'); var path = require('path'); var moment = require('moment'); var formidable = require('formidable'); var imageUpload = function ()

Node.js用fs.renameSync报cross-device link not permitted错

今天把 Manuel Kiessling 的[The Node Beginner Book]的中文版 [Node入门](http://www.nodebeginner.org/index-zh-cn.html#javascript-and-you),的确是一本非常棒的教材,语言轻松幽默.完全木有技术书籍的枯燥,消除了新学习Node.js人员的恐惧感. 跟着书本里的例子,一步步的写,很容易就对Node.js有个大概的了解. 不过写的最后个例子--上传图片的时候,会出现一个错误 cross-devi

Node.js用fs.renameSync报cross-device link not permitted错误

今天阅读了  Manuel Kiessling 的 <Node入门>   对node.js有一个大概的了解,在本书最后的一个例子上传图片时出现一些问题 问题:跨目录重命名文件导致的问题 (fs.renameSync) 解决方案: 1.添加临时路径 var form = new formidable.IncomingForm(); form.uploadDir='tmp'; //临时路径 2.利用fs的createReadStream.createWriteSream和unlinkSync方法

解决node.js使用fs读取文件出错

解决node.js使用fs读取文件出错:https://www.cnblogs.com/xinsir/p/10315485.html 今天配接口,使用fs模块读取json出现了错误'no such file or directory',然后经查终于解决,特此记录. 使用nodejs的fs模块读取文件时习惯用相对路径,但是运行的时候出现了上述的错误,原因就是fs模块读取文件的相对路径是以启动server.js的位置为基准的,而不是以server.js文件的位置. 这就是这篇文章所要讲述的问题.并且

关于Node.js的httpClieint请求报错ECONNRESET的原因和解决措施

背景说明 最近在工作项目中有下面一个场景: 使用Node.js的express框架实现了一个文件系统服务器端,其中有个API用于客户端上传文件.客户端使用Node.js的HttpClient来调用服务器端的API上传文件. 客户端在上传小文件时没有任何问题,在上传大文件时httpClient请求报错了下面的错误, { [Error: socket hang up] code: 'ECONNRESET' } google了很多资料,最后看了一下Node.js的相关源码终于知道了该问题的原因和解决办

利用async和await异步操作解决node.js里面fs模块异步读写,同步结果的问题

async await 解决异步问题,这两个关键字是es7提出的,所以测试,node和浏览器版本提高一些 async await 操作基于promise实现的 async await这两个关键字是一起使用,分开使用会报错 await 后面只能跟promise对象 不熟悉的promise异步操作的朋友,去看看我promise那边文章 Promise 解决多层嵌套,回调地狱什么叫回调地狱写一个实例,就是恶心的多层欠嵌套 function a(){ function b(){ function c()

node.js 框架express关于报错页面的配置

1.声明报错的方法,以及相对应的页面 //把数据库的调用方法配置到请求中 server.use((req, res, next) => { //把数据库存入req中 req.db = db; //把报错方法存入res中 res.showError = code => { switch (code) { case 404: res.status(code).render('404', {}); break; case 500: res.status(code).render('500', {})

调用系统命令 system-config-kickstart 报错,解决办法如下

[[email protected] ~]# system-config-kickstart Xlib:  extension "RANDR" missing on display "localhost:10.0". /usr/share/system-config-kickstart/kickstartGui.py:103: GtkWarning: GtkSpinButton: setting an adjustment with non-zero page si

PHP多次调用Mysql存储过程报错解决办法

PHP多次调用Mysql数据库的存储过程会出现问题,主要问题为存储过程中执行多次SQL语句不能一一释放导致的,网上找了一些解决办法,比如使用 multi_query 然后一个一个释放,但是发现根本不适合我们的项目,我们使用CI框架写的,更多的是使用CI的数据库处理方法.所以只能另辟蹊径. 一次偶然,把Mysql链接方式改成了mysqli,两种不同的PHP连接mysql的扩展,官方在高版本中推荐使用mysqli,结果却奇迹般好了,使用Mysql长连接也行,天意么? PHP多次调用Mysql存储过程