Mover archivo en ExpressJS / NodeJS

Estoy intentando mover el archivo cargado de /tmp al directorio de home utilizando NodeJS / ExpressJS:

 fs.rename('/tmp/xxxxx', '/home/user/xxxxx', function(err){ if (err) res.json(err); console.log('done renaming'); }); 

Pero no funcionó y no se encontró ningún error. Pero cuando hay un nuevo camino en /tmp , eso funcionará.

Estoy usando Ubuntu, el home está en una partición diferente. Alguna solucion?

Gracias

Sí, fs.rename no mueve el archivo entre dos discos / particiones diferentes. Este es el comportamiento correcto . fs.rename proporciona una funcionalidad idéntica a rename(2) en linux.

Lea el tema relacionado publicado aquí .

Para obtener lo que quieres, deberías hacer algo como esto:

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

Otra forma es usar fs.writeFile . fs.unlink en callback eliminará el archivo temporal del directorio 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); }); }); }); 

Solución ES6 actualizada lista para usar con promesas y 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); }); } 

Este ejemplo tomado de: Node.js en Acción

Una función move () que cambia el nombre, si es posible, o vuelve a copiarse

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