Node.js文件系统 – 保存唯一的文件名

我正在使用节点文件系统保存上传的图像,使用while循环来检查现有的文件名,递增++,直到有一个唯一的文件名。

代码不工作,得到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的callback,这确实是非法的。 这可能会更容易使用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的asynchronous版本。 您需要使用同步版本fs.existsSync为您的循环工作。

警告

使用请求提供的名称存储上传的文件是一个坏主意,因为它允许黑客放置相对path,并可能将文件存储在不希望它们结束的地方。

同样,允许使用查询string中的path下载这些上传的文件是一个好主意。 黑客可以这样写: http : //example.com/download?fileName=../../somethingnotexposed/

在打开之前检查一个文件是否存在是一个反模式,使您容易受到竞争条件的影响:另一个进程可以在对fs.exists()和fs.open()

你可以使用fsu模块https://github.com/velocityzen/fsu