Home > Web Front-end > JS Tutorial > 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)

小云云
Release: 2017-12-27 13:43:32
Original
1756 people have browsed it

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();
 });
 }
Copy after login

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();
 });
 }
Copy after login

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;);
});
Copy after login

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();
 });
 }
Copy after login

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!

Related labels:
source:php.cn
Statement of this Website
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
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template