1

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

    });

  }
4

3 回答 3

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 回答
2

回答

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

警告

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

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

于 2013-07-30T13:41:39.893 回答
1

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

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

于 2014-04-06T11:14:52.563 回答