08月01, 2019

Node.js部署跨硬盘分区保存图片文件报错

使用windows系统部署nodejs的时候,由于图片上传后的目录在C盘的临时文件夹下,如果我的代码部署在D盘,则使用fs.renameSync的时候可能会报错:

var fs = require("fs"),
    util = require('util');
    ...
    fs.renameSync(files.upload.path, "/tmp/test.png");  

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

报错如下:

D:\tmp\tmp_dev_root\node.js>
D:\tmp\tmp_dev_root\node.js>node index.js
Server has started.
Request for /upload received.
About to route a request for /upload
Request handler 'upload' was called.
about to parse
parsing done

fs.js:439
  return binding.rename(pathModule._makeLong(oldPath),
                 ^
Error: EXDEV, cross-device link not permitted 'C:\Users\CLi\AppData\Local\Temp\df99513a93a1cbfbc26e076f8ae08b92'
    at Object.fs.renameSync (fs.js:439:18)
    at D:\tmp\tmp_dev_root\node.js\requestHandlers.js:34:8
    at IncomingForm.parse (D:\tmp\tmp_dev_root\node.js\node_modules\formidable\lib\incoming_form.js:121:9)
    at IncomingForm.EventEmitter.emit (events.js:93:17)
    at IncomingForm._maybeEnd (D:\tmp\tmp_dev_root\node.js\node_modules\formidable\lib\incoming_form.js:383:8)
    at IncomingForm.handlePart (D:\tmp\tmp_dev_root\node.js\node_modules\formidable\lib\incoming_form.js:212:12)
    at File.end (D:\tmp\tmp_dev_root\node.js\node_modules\formidable\lib\file.js:71:5)
    at WriteStream.flush (fs.js:1515:9)
    at Object.oncomplete (fs.js:297:15)

解决:

var fs = require("fs"),
    util = require('util');
    ...
    //fs.renameSync(files.upload.path, "/tmp/test.png");

    var readStream = fs.createReadStream(files.upload.path)
    var writeStream = fs.createWriteStream("/tmp/test.png");

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

参考:

https://www.crifan.com/node_js_use_fs_renamesync_error_exdev_cross_device_link_not_permitted/

本文链接:https://www.daguanren.cc/post/cross_disk_save_images.html

-- EOF --

Comments