Home  >  Article  >  Web Front-end  >  How to deal with the error reported when Node.js calls fs.renameSync (Error: EXDEV, cross-device link not permitted)

How to deal with the error reported when Node.js calls fs.renameSync (Error: EXDEV, cross-device link not permitted)

小云云
小云云Original
2017-12-27 13:43:321634browse

This article mainly introduces the error reported when Node.js calls fs.renameSync (Error: EXDEV, cross-device link not permitted). It is of great practical value. Friends who need it can refer to it. I hope it can help everyone.

When writing a file upload function, there is an error in calling the fs.renameSync method

The error code is as follows:


 function upload(response,request){
 console.log("upload called");
 var form = new formidable.IncomingForm();
 console.log("about to parse");
 form.parse(request, function(error, fields, files) {
  console.log("parsing done");
  fs.renameSync(files.upload.path, "./tmp/test.jpg");
  response.writeHead(200, {"Content-Type": "text/html"});
  response.write("received image:<br/>");
  response.write("<img src=&#39;/show&#39; />");
  response.end();
 });
 }

Brief analysis Finally, it is expected that there will be permission issues when moving or operating files across disk partitions.

Two solutions are provided below:

Method 1:

Mainly use the createReadStream, createWriteSream and unlinkSync methods of fs

The specific code is as follows:


 function upload(response,request){
 console.log("upload called");
 var form = new formidable.IncomingForm();
 console.log("about to parse");
 form.parse(request, function(error, fields, files) {
  console.log("parsing done");

 // fs.renameSync(files.upload.path, "./tmp/test.jpg");
  var readStream=fs.createReadStream(files.upload.path);
  var writeStream=fs.createWriteStream("./tmp/test.jpg");
  readStream.pipe(writeStream);
  readStream.on(&#39;end&#39;,function(){
  fs.unlinkSync(files.upload.path);
  });

  response.writeHead(200, {"Content-Type": "text/html"});
  response.write("received image:<br/>");
  response.write("<img src=&#39;/show&#39; />");
  response.end();
 });
 }

PS: The node version I use is 0.10.69. If you are using a version below 0.6, you can use util .pump

The corresponding code only needs to change the readStream.on in the above code to: (note the introduction of the util module)


util.pump(readStream,writeStream, function() {
 fs.unlinkSync(&#39;files.upload.path&#39;);
});

method Two:

This is much simpler

Just add a form.uploadDir='tmp' (write a temporary path)


 function upload(response,request){
 console.log("upload called");
 var form = new formidable.IncomingForm();
 form.uploadDir=&#39;tmp&#39;;
 console.log("about to parse");
 form.parse(request, function(error, fields, files) {
  console.log("parsing done");
  fs.renameSync(files.upload.path, "./tmp/test.jpg");
  response.writeHead(, {"Content-Type": "text/html"});
  response.write("received image:<br/>");
  response.write("<img src=&#39;/show&#39; />");
  response.end();
 });
 }

Related recommendations:

Instructions for using the fs.renameSync method in node.js_node.js

Detailed explanation of node .js uses websocket based on express

How to use the async function in Node.js

The above is the detailed content of How to deal with the error reported when Node.js calls fs.renameSync (Error: EXDEV, cross-device link not permitted). For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn