簡體   English   中英

Node.js文件系統-保存唯一的文件名

[英]Node.js File System - Saving unique file names

我正在使用節點文件系統保存上載的圖像,使用while循環檢查現有文件名,然后遞增++直到有唯一的文件名。

代碼無法正常工作,出現SyntaxError: Illegal break statement我的break;位置出現SyntaxError: Illegal break statement錯誤break; 行以及while循環永遠不會在循環中正確讀取我的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;
        }

    });

  }

回答

您的代碼正在使用fs.exists的異步版本。 您需要使用同步版本fs.existsSync才能使循環正常工作。

警告

使用請求提供的名稱存儲上載的文件不是一個好主意,因為它允許黑客放置相對路徑,並可能將文件存儲在您不希望它們最終出現的位置。

同樣,允許使用querystring中的路徑下載那些上傳的文件也是一個壞主意。 黑客可以這樣寫: http : //example.com/download?fileName=../../somethingnotexposed/

您試圖打破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;
    }
}

在打開之前檢查文件是否存在是一種反模式,使您容易遇到競爭狀況:另一個過程可以在調用fs.exists()和fs.open()之間刪除文件。

您可以使用fsu模塊https://github.com/velocityzen/fsu

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM