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
before writing one When using the 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='/show' />"); response.end(); }); }
After a rough analysis, it is estimated that there is a permission issue 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('end',function(){ fs.unlinkSync(files.upload.path); }); response.writeHead(200, {"Content-Type": "text/html"}); response.write("received image:<br/>"); response.write("<img src='/show' />"); 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
accordingly The 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('files.upload.path'); });
Method 2:
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='tmp'; 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='/show' />"); response.end(); }); }
The above is what I compiled for everyone. I hope it will be helpful to everyone in the future.
Related articles:
How to implement various sorting methods using js
How to implement the guessing game using JavaScript (detailed tutorial)
How to use the node module and npm package management tool
How to use JS to implement the input search function
How to implement WeChat Jump Game using Three.js
The above is the detailed content of An error occurs when calling fs.renameSync in Node.js?. For more information, please follow other related articles on the PHP Chinese website!