使用节点 js aws-sdk 检查 S3 上是否存在文件夹

Check if a folder exists on S3 using node js aws-sdk

首先,我知道没有文件夹这样的东西,但是,我使用该术语只是为了简单起见。现在我的桶里有很多东西。 对于某些文件夹,我可以使用 getObject 来查找它们是否存在,但对于大多数文件夹,当我清楚地看到它们存在时,我会收到错误 No such key 。我还想说我已经尝试过 headObject、listObjectV2,但没有成功。

this is my params object
{
     Bucket: bucket //bucket is defined in the program
     Key: folder // defined in the program above
                 //example key - abc-1-1/00000N/30/2018.10.7.8/
                 //inside this folder are multiple files 
}

目标是查找文件夹是否存在,并据此进行一些处理。我看到很多关于这个问题的答案,建议使用 headObject、getObjects 等,但是 none 其中似乎有效

这是我的 getObjects 代码片段

params = {
            Bucket: bucket,
            Key: folder
        }
        s3.getObject(params, function (err, found) {

            if (err){ 
                console.log('bucket is'+bucket);
                ..........
                .....
            }
            else{
                ....
            }
            ..
            });

headObject 为何无法正常工作?如果您在 s3 存储桶中搜索一个目录,它应该返回以下两种情况之一:

  1. 如果请求的资源不存在(包括目录),则状态代码为 'NotFound' 的错误。
  2. 包含有关该对象的一些详细信息的回复。

你可以在下面找到一个简单的实现 now 来编写一个 "check" 函数:

      s3.headObject({Bucket: 'whatever-the-bucket-name-is', Key: 'directory/'}, (err, data) => {
        if (err && err.code === 'NotFound') resolve(false)
        else if (err) reject(err)
        resolve(true)
      })

希望对您有所帮助。

如果您要检查存储桶是否存在,那么这里是解决方案

var AWS = require('aws-sdk');
var s3 = {
  accessKeyId: '',
  secretAccessKey: '',
  bucketName: ''
}
AWS.config.update({
  accessKeyId: s3.accessKeyId,
  secretAccessKey: s3.secretAccessKey,
  // region: {region} - Add if needed
});

var s3bucket = new AWS.S3({ params: { Bucket: s3.bucketName } });
var options = {
  Bucket: s3.bucketName
};

function checkBucket(){
  try {
    await s3bucket.headBucket(options).promise();  
    console.log('bucket exists');
    // do the required operations here
  } catch (err) {
    if (err.statusCode === 404) {
      return error("Bucket doesn't exists.");
    }
  }
}

(async() =>{
  await checkBucket();
})()

我终于找到了这种情况的解决方法。如果您的应用程序要求您检查特定对象 ("folder") 是否存在,并在该对象 ("folder") 实际存在时进一步处理,您可以使用此解决方案。我认为 s3.getObject 或 s3.headObject 的工作方式存在问题,无论如何这是解决方案。

1) 使用 s3.listObjectsV2 方法。

2) 检查响应的内容字段。如果为空,则您提供的前缀不存在。 这是代码片段

s3.listObjectsV2(params, function (err, found) {

                if (err){ 
                    console.log(err);
                    errJson = {
                        'status': -1,
                        'message': 'Error while trying to list files'
                    };
                    callback(errJson);

                } 
                else {  

                    if (found.Contents.length === 0) {

                        errJson = {
                            'status': 0,
                            'message': 'Either the files are not present at s3 or the folder is incorrect '
                        }
                        callback(errJson);
                    }
                    else{
                               .....
                    }
....
});

为了检查 "folder" 是否存在,请检查存储桶中是否至少有一个对象的键以文件夹名称加上尾部斜杠开头。

这可以使用 listObjectV2 方法完成,如下所示:

const s3 = ... // S3 client

const Bucket = 'mybucket';
const Prefix = 'myfolder/mysubfolder/';
const MaxKeys = 1; // If a single object is found, the folder exists.
const params = {
      Bucket,
      Prefix,
      MaxKeys
};

s3.listObjectsV2(params, (err, data) => {
  const folderExists = data.Contents.length > 0;

  // (folderExists == true) if the folder exists
});

注意:上面使用文件夹的定义是指至少有一个以文件夹为前缀的key。

要检测 "empty folders",可能会检查文件夹 + _$folder$ 后缀,如前所述 here