2013-07-15 21 views
9

私はNodeJS/ExpressJSを使用してhomeディレクトリに/tmpからアップロードされたファイルを移動しようとしています:ファイルの移動

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

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

しかし、それは動作しませんでしたとエラーが発生しません。しかし、新しいパスが/tmpにもある場合は、それは動作します。

私はUbuntuを使用しています。homeは別のパーティションにあります。すべての修正?

ありがとう

答えて

18

はい、fs.renameは2つの異なるディスク/パーティション間でファイルを移動しません。これはの正しいの動作です。 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 */ }); 
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); 
    }); 
} 
関連する問題