【问题标题】:Move File in ExpressJS/NodeJS在 ExpressJS/NodeJS 中移动文件
【发布时间】:2017-05-23 18:18:27
【问题描述】:

我正在尝试使用 NodeJS/ExpressJS 将上传的文件从 /tmp 移动到 home 目录:

fs.rename('/tmp/xxxxx', '/home/user/xxxxx', function(err){
    if (err) res.json(err);

console.log('done renaming');
});

但它不起作用,也没有遇到错误。但是当新路径也在/tmp 中时,它会起作用。

我使用的是 Ubuntu,home 在不同的分区。有什么办法吗?

谢谢

【问题讨论】:

    标签: node.js file ubuntu file-upload express


    【解决方案1】:

    是的,fs.rename 不会在两个不同的磁盘/分区之间移动文件。这是正确的行为。 fs.rename 提供与 linux 中的 rename(2) 相同的功能。

    阅读here发布的相关问题。

    要得到你想要的,你必须这样做:

    var source = fs.createReadStream('/path/to/source');
    var dest = fs.createWriteStream('/path/to/dest');
    
    source.pipe(dest);
    source.on('end', function() { /* copied */ });
    source.on('error', function(err) { /* error */ });
    

    【讨论】:

      【解决方案2】:

      另一种方法是使用fs.writeFile。回调中的fs.unlink 将从 tmp 目录中删除临时文件。

      var oldPath = req.files.file.path;
      var newPath = ...;
      
      fs.readFile(oldPath , function(err, data) {
          fs.writeFile(newPath, data, function(err) {
              fs.unlink(oldPath, function(){
                  if(err) throw err;
                  res.send("File uploaded to: " + newPath);
              });
          }); 
      }); 
      

      【讨论】:

      • 这里面的数据是什么?以及如何从请求对象中获取它?
      • 新路径是什么?
      【解决方案3】:

      更新的 ES6 解决方案准备好与 promises 和 async/await 一起使用:

      function moveFile(from, to) {
          const source = fs.createReadStream(from);
          const dest = fs.createWriteStream(to);
      
          return new Promise((resolve, reject) => {
              source.on('end', resolve);
              source.on('error', reject);
              source.pipe(dest);
          });
      }
      

      【讨论】:

        【解决方案4】:

        本示例取自:Node.js in Action

        一个 move() 函数,如果可能的话,它会重命名或回退到复制

        var fs = require('fs');
        module.exports = function move (oldPath, newPath, callback) {
        fs.rename(oldPath, newPath, function (err) {
        if (err) {
        if (err.code === 'EXDEV') {
        copy();
        } else {
        callback(err);
        }
        return;
        }
        callback();
        });
        function copy () {
        var readStream = fs.createReadStream(oldPath);
        var writeStream = fs.createWriteStream(newPath);
        readStream.on('error', callback);
        writeStream.on('error', callback);
        readStream.on('close', function () {
        fs.unlink(oldPath, callback);
        });
        readStream.pipe(writeStream);
        }
        }
        

        【讨论】:

          猜你喜欢
          • 2011-10-13
          • 1970-01-01
          • 1970-01-01
          • 2014-03-29
          • 2018-08-28
          • 1970-01-01
          • 2013-12-13
          • 2012-09-09
          • 1970-01-01
          相关资源
          最近更新 更多