Перемещение файла в 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);
}
}