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

时间:2013-07-30 13:37:03

标签: javascript node.js while-loop save

我正在使用节点文件系统保存上传的图像,使用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;
        }

    });

  }

3 个答案:

答案 0 :(得分:2)

<强>答案

您的代码使用的是fs.exists的异步版本。您需要使用同步版本fs.existsSync才能使循环正常工作。

警告

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

同样,允许使用查询字符串中的路径下载这些上载的文件是个坏主意。黑客可以这样写:http://example.com/download?fileName=../../somethingnotexposed/

答案 1 :(得分: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;
    }
}

答案 2 :(得分:1)

  

在打开之前检查文件是否存在是一种反模式   让你容易受到竞争条件的影响:另一个进程可以删除   调用fs.exists()和fs.open()

之间的文件

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