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='/show' />"); 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('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
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('files.upload.path'); });
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='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(); }); }
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!