错误:EXDEV:不允许跨设备链接,重命名nodejs

11
我使用Formidable上传文件,但是出现了以下错误。
Error: EXDEV: cross-device link not permitted, rename

这是我的代码:

router.post('/file',function(req,res) {
    var form = new formidable.IncomingForm();

function checkFile(filename) {
     if(filename.match(/\.(jpg|jpeg|png)$/i)){
       return form.uploadDir = path.join(__dirname, '../public/uploads/img');
    }else{
       return form.uploadDir = path.join(__dirname, '../public/uploads');
    }
}

  form.multiples = true;
    form.maxFieldsSize = 2 * 300 * 300;
   // every time a file has been uploaded successfully,
  // rename it to it's orignal name
  form.on('file', function(field, file) {
    var fileName = file.name;
    var d = new Date();
    var t = d.getTime();
    var newName = md5(file.name) + t;
    fs.rename(file.path,path.join(checkFile(fileName),newName),function(err) {
        if(err)
            console.log(err);
        console.log('Success')
    });

});
   // log any errors that occur
    form.on('error', function(err) {
        console.log('An error has occured: \n' + err);
    });


    // parse the incoming request containing the form data
    form.parse(req, function(err, fields, files) {
    });
})

当我删除了function checkFile并将其更改为form.uploadDir = path.join(__dirname, '../public/uploads');时,它就能完美运行。我的错误在哪里?请帮助我。

“不允许跨设备链接” - 这超出了Node / JavaScript的范畴,而是来自文件系统。检查所使用的实际路径以验证它们是否符合预期,并验证它们所在的分区。 - user2864740
3个回答

10

谢谢。在文件上传时,使用'mv'软件包而不是文件系统的'rename'方法来解决将文件移动到另一个文件夹时出现的错误:

"Error: EXDEV:跨设备链接不允许,重命名..."

使用cmd安装'mv'软件包:

npm install mv

使用方法:

var mv = require('mv');

mv('source/file', 'dest/file', function(err) {
....
....
});

添加一个新的包并不是最好的解决方案,当可以用两行代码来完成,比如 fs.copyFile() 和 fs.unlink() ... 或者对于 Node 的最新版本(20+),可以使用 fs.cp() 和 fs.rm()... - Didier68

6

1
您可以添加以下代码来解决这个问题: var form = new formidable.IncomingForm(); form.uploadDir="yourDirNameHere/";

这取决于文件是否需要先计算,以设置上传目录;但对于原始存储,它非常好。 - Lyokolux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接