Перемещение файла в ExpressJS/NodeJS
Я пытаюсь переместить файл из /tmp
to home
каталог с помощью NodeJS / ExpressJS:
fs.rename('/tmp/xxxxx', '/home/user/xxxxx', function(err){
if (err) res.json(err);
console.log('done renaming');
});
но это не сработало, и ошибка не обнаружена. Но когда новый путь также находится в /tmp
, это сработает.
Im с помощью Ubuntu,home
находится в другом разделе. Что-нибудь исправить?
спасибо
4 ответов
Да, fs.переименование не перемещает файл между двумя разными дисками / разделами. Это правильно поведение. fs.rename
обеспечивает идентичную функциональность rename(2)
в linux.
прочитайте связанный вопросздесь.
чтобы получить то, что вы хотите, вам придется сделать что-то вроде этого:
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 */ });
другой способ-использовать fs.writeFile
. fs.unlink
in callback удалит временный файл из каталога 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);
});
});
});
Обновлено решение ES6, готовое к использованию с обещаниями и 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);
});
}
этот пример взят из: узел.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);
}
}