11

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

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

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

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

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

ありがとう

4

4 に答える 4

20

はい、fs.rename は 2 つの異なるディスク/パーティション間でファイルを移動しません。これは正しい動作です。Linuxfs.renameと同じ機能を提供します。rename(2)

ここに投稿された関連する問題をお読みください。

必要なものを取得するには、次のようにする必要があります。

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 */ });
于 2013-07-15T12:17:22.190 に答える
11

別の方法は、を使用すること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);
        });
    }); 
}); 
于 2014-01-29T12:59:47.397 に答える
1

この例は以下から抜粋: Node.js in Action

可能であれば名前を変更するか、コピーにフォールバックする 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);
}
}
于 2015-03-17T17:10:47.497 に答える