错误:EXDEV:不允许跨设备链接,在Ubuntu 16.04 LTS上重命名'/ tmp /

Far*_*dho 6 postgresql node.js cross-device ubuntu-16.04

我有问题上传文件nodejs.我读过 stack1stack2.但我认为终端输出的这种不同情况如下:

> Unhandled rejection Error: EXDEV: cross-device link not permitted,
> rename '/tmp/31941-53enly.png' ->
> 'public/files/complaint/Screenshot_2016-05-01_01-16-55.png'
>     at Error (native)
>     at Object.fs.renameSync (fs.js:681:18)
>     at null.<anonymous> (/home/faris/myprojects/orchestrale-server/routes/complaintimage.js:163:20)
>     at tryCatcher (/home/faris/myprojects/orchestrale-server/node_modules/sequelize/node_modules/bluebird/js/release/util.js:16:23)
>     at Promise._settlePromiseFromHandler (/home/faris/myprojects/orchestrale-server/node_modules/sequelize/node_modules/bluebird/js/release/promise.js:502:31)
>     at Promise._settlePromise (/home/faris/myprojects/orchestrale-server/node_modules/sequelize/node_modules/bluebird/js/release/promise.js:559:18)
>     at Promise._settlePromise0 (/home/faris/myprojects/orchestrale-server/node_modules/sequelize/node_modules/bluebird/js/release/promise.js:604:10)
>     at Promise._settlePromises (/home/faris/myprojects/orchestrale-server/node_modules/sequelize/node_modules/bluebird/js/release/promise.js:683:18)
>     at Async._drainQueue (/home/faris/myprojects/orchestrale-server/node_modules/sequelize/node_modules/bluebird/js/release/async.js:138:16)
>     at Async._drainQueues (/home/faris/myprojects/orchestrale-server/node_modules/sequelize/node_modules/bluebird/js/release/async.js:148:10)
>     at Immediate.Async.drainQueues [as _onImmediate] (/home/faris/myprojects/orchestrale-server/node_modules/sequelize/node_modules/bluebird/js/release/async.js:17:14)
>     at processImmediate [as _immediateCallback] (timers.js:383:17)
Run Code Online (Sandbox Code Playgroud)

我的代码:

  if (_.isEmpty(req.files) == false) {
      var tp = avatar_folder+req.files.file.name;
      fs.renameSync(req.files.file.path, tp, function(err){});
      var avatar = req.files.file.name;
      }
Run Code Online (Sandbox Code Playgroud)

代码工作在另一个发行版像基本操作系统,但当我在debian jessie或ubuntu 16 LTS上运行项目时,错误导致终端.

任何身体都无法帮忙?该代码只是在基本的os和arch上完美运行.

fra*_*ntb 13

同样的问题.解决方法:读取临时文件,将文件写入新位置并删除临时文件:

        // Read the file
        fs.readFile(oldpath, function (err, data) {
            if (err) throw err;
            console.log('File read!');

            // Write the file
            fs.writeFile(newpath, data, function (err) {
                if (err) throw err;
                res.write('File uploaded and moved!');
                res.end();
                console.log('File written!');
            });

            // Delete the file
            fs.unlink(oldpath, function (err) {
                if (err) throw err;
                console.log('File deleted!');
            });
        });
Run Code Online (Sandbox Code Playgroud)


VnD*_*vil 6

你可以使用'mv'包来解决这个问题链接NPM:https ://www.npmjs.com/package/mv 使用方法:

用 fs.rename 替换一些旧代码:

    fs.rename(temp_path, target_path, (err) => {
        if (err) {
            console.log('> FileServer.jsx | route: "/files/upload" | err:', err);
            throw err;
        }
    });
Run Code Online (Sandbox Code Playgroud)

和:

    const mv = require('mv');
    mv(temp_path, target_path, function (err) {
        if (err) {
            console.log('> FileServer.jsx | route: "/files/upload" | err:', err);
            throw err;
        }
    });
Run Code Online (Sandbox Code Playgroud)


小智 -1

是的,你可以解决这个问题。

  1. 通过命令安装mv

    npm install mv --save
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在你的nodejs文件中添加mv

    var mv = require('mv');
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将文件移动为:

    mv('source_file', 'destination_file,' function(err) {
        if (err) { throw err; }
    console.log('file moved successfully');
    };
    
    Run Code Online (Sandbox Code Playgroud)