1

Node File System を使用してアップロードされた画像を保存し、while ループを使用して既存のファイル名を確認し、一意のファイル名になるまで ++ をインクリメントしています。

コードが機能せずSyntaxError: Illegal break statement、行の配置に関するエラーが発生し、while ループがループ内で関数をbreak;正しく読み取れません。fs.exists()

ここで論理的に完全に間違ったことをしていますか?fs.writeFile()既存のファイルを上書きしないようにする簡単な方法はありますか?

コード:

  var fileExist = true;
  var fileName = req.files.files[0].name.substr(0, req.files.files[0].name.lastIndexOf('.')) || req.files.files[0].name;
  var fileType = req.files.files[0].name.split('.').pop();
  var fileNumber = 1;

  while (fileExist) {

    fileNumber_str = fileNumber.toString(); 

    var current = fileName + fileNumber_str + '.' + fileType;

    fs.exists( __dirname + "/uploads/" + current, function(exists){

        if (exists) {
            fileNumber++;
        }

        if (!exists) {

            var newPath = __dirname + "/uploads/" + current;
            fs.writeFile(newPath, data, function (err) {
                res.send('saved');
            });

            break;
        }

    });

  }
4

3 に答える 3

2

答え

あなたのコードは fs.exists の非同期バージョンを使用しています。ループを機能させるには、同期バージョン fs.existsSync を使用する必要があります。

警告

リクエストによって提供された名前を使用してアップロードされたファイルを保存することは、ハッカーが相対パスを入力し、ファイルを最終的に望まない場所に保存する可能性があるため、悪い考えです。

同様に、これらのアップロードされたファイルをクエリ文字列のパスを使用してダウンロードできるようにすることもお勧めできません。ハッカーは次のように書くことができます: http://example.com/download?fileName=../../somethingnotexposed/

于 2013-07-30T13:41:39.893 に答える
2

fs.exists のコールバックから抜け出そうとしていますが、これは実際には違法です。fs.existsSync を使用する方が簡単かもしれません

元:

while (fileExist) {

    fileNumber_str = fileNumber.toString(); 

    var current = fileName + fileNumber_str + '.' + fileType;


    if (fs.existsSync(__dirname + "/uploads/" + current)) {
        fileNumber++;
    } else {
        var newPath = __dirname + "/uploads/" + current;
        fs.writeFile(newPath, data, function (err) {
            res.send('saved');
        });

        break;
    }
}
于 2013-07-30T13:53:23.977 に答える
1

開く前にファイルが存在するかどうかを確認することは、競合状態に対して脆弱なアンチパターンです: 別のプロセスが fs.exists() と fs.open() の呼び出しの間にファイルを削除する可能性があります

fsu モジュールを使用できますhttps://github.com/velocityzen/fsu

于 2014-04-06T11:14:52.563 に答える