2013-07-15 2 views
9

Я пытаюсь переместить загруженный файл из /tmp в home каталога с помощью NodeJS/ExpressJS:Перемещение файла в ExpressJS/NodeJS

fs.rename('/tmp/xxxxx', '/home/user/xxxxx', function(err){ 
    if (err) res.json(err); 

console.log('done renaming'); 
}); 

Но это не сработало, и никаких ошибок не возникало. Но когда новый путь также находится в /tmp, это сработает.

Im, использующий Ubuntu, home находится в разных разделах. Любое исправление?

Благодаря

ответ

18

Да, fs.rename не перемещает файлы между двумя различными дисков/разделов. Это правильное поведение. fs.rename обеспечивает идентичную функциональность rename(2) в linux.

Прочитать связанную с этим проблему 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 */ }); 
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); 
     }); 
    }); 
}); 
+0

что такое ** данные ** в этом? и как я могу получить его из объекта запроса? – Vishal

0

Этот пример взят из:

А функция Node.js in Action движение(), который переименовывает, если это возможно, или падает обратно на копирование

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); 
} 
} 
1

Обновленный раствор ES6 готов к использованию с обещаниями и асинхронными/ожидаемыми:

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); 
    }); 
} 
Смежные вопросы