[英]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.