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