在ExpressJS/NodeJS中如何移动文件

11

我正在尝试使用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个回答

20

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

阅读相关问题发布的这里

要获得您想要的内容,您需要执行以下操作:

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

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

这里的“data”是什么?我该如何从请求对象中获取它? - Vishal
新路径将是什么? - s.j

4

更新的ES6解决方案已准备好与Promise和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);
    });
}

1
此示例摘自:Node.js实战

一个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);
}
}

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