在ExpressJS / NodeJS中移动文件

时间:2013-07-15 08:11:57

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

我正在尝试使用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位于不同的分区中。任何修复?

由于

4 个答案:

答案 0 :(得分:19)

是的,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 */ });

答案 1 :(得分:10)

另一种方法是使用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);
        });
    }); 
}); 

答案 2 :(得分:2)

更新了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);
    });
}

答案 3 :(得分:0)

此示例取自: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);
}
}