2016-04-15 18 views
2

クライアントからノードサーバーにファイルをアップロードする必要があります(このタスクを実行するにはMulterを使用します)。Multerを使用してNodeJsにファイルをアップロードし、ファイルがすでに存在する場合は名前を変更してください。

同じ名前のファイルがすでにサーバー上に存在する場合は、新しいファイルの名前を変更する必要があります。 Node fs.statを使って、同じ名前のファイルが存在するかどうかを調べます。

fs.statは、実際には同じ名前のファイルが存在しないことを常に教えているので、私は間違っている必要があります(私は古いファイルを上書きしてしまいます)。

ここにコードがあります。

 var imagesDirectory = 'images'; 
     var imageDir = '/' + imagesDirectory + '/'; 
     var storageDisk = multer.diskStorage({ 
      destination: imagesDirectory, 
      filename: function (req, file, callback) { 
       let uploadedFileName; 
       fs.stat(imageDir + file.originalname, function(err, stat) { 
        if (err==null) { 
         uploadedFileName = Date.now() + '.' + file.originalname; 
        } else if(err.code == 'ENOENT') { 
         uploadedFileName = file.originalname; 
        } else { 
         console.log('Some other error: ', err.code); 
        } 
        callback(null, uploadedFileName) 
       }); 
      } 
     }) 
     var uploadImage = multer({ storage: storageDisk, limits: {fileSize: 1000000, files:1}, }).single('imageFile'); 
     router.post('/image', function(req, res) { 
      uploadImage(req, res, function (err) { 
       if (err) { 
        // An error occurred when uploading 
        console.log(err); 
       } 
// do something to prepare the response and send it back to the client 
prepareResponseAndSendItBack(req.file.filename, imageDir, res, err); 
      }) 
     }) 
+0

あなたが/ ... ''のFSに '/画像を渡している実現します。 stat() 'そうですか?そのパスはファイルシステム上の絶対パスであり、パブリックディレクトリに関連するURLパスではありません。 '/ usr'、'/lib'などと並んで、あなたのファイルシステムのルートに実際にディレクトリが存在することを確かめますか? – mscdex

+0

Thx。私は実現していなかった。最初の '/'を削除した後、すべてが期待通りに機能します。 – Picci

答えて

1

私は、fs.existsがそのタスクに適していると信じています。

fs.exists(imageDir + file.originalname, function(exists) { 
    let uploadedFileName; 
    if (exists) { 
     uploadedFileName = Date.now() + '.' + file.originalname; 
    } else { 
     uploadedFileName = file.originalname; 
    } 
    callback(null, uploadedFileName) 
}); 

また、あなたはフルパス(または現在のファイルへの相対1)を通過していることを確認し、ファイルの

+1

実際には、 'fs.stat()'はファイルやディレクトリなど、パス*が存在するかどうかを知りたいので、ほとんどの場合、より良い解決策です。 – mscdex

+1

@mscdex競合状態が発生する可能性があるので、 'fs.exists'はhttps://nodejs.org/api/fs.html#fs_fs_exists_path_callbackで廃止されたようです。だからそれを避けるほうがいい。しかし、私はあなたのポイントを得ることはありません。 'fs.exists'はファイルとディレクトリの両方で動作します。 – jahnestacado

+0

'fs.exists()'を使って読み込み前にファイルが存在するかどうかを確認しているとしましょう(何らかの理由で)。渡したパスが実際にディレクトリである場合、 'fs.exists()'は 'true'を返すだけなので、あなたは知りません。それから、(例えば 'fs.open()'を使って)読み込みに行くと、ファイルではなくディレクトリなのでエラーになります。だから 'fs.stat()'を使って存在と*を同時にテストしています*あなたはディレクトリ、普通のファイル、デバイスなどであるかどうかを知ることもできます – mscdex

関連する問題