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

cap*_*der 5 amazon-s3 amazon-web-services 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 
}
Run Code Online (Sandbox Code Playgroud)

目标是查找文件夹是否存在,并基于此进行一些处理。我看到这个问题的很多答案都暗示了 headObject、getObjects 等,但它们似乎都不起作用

这是我的 getObjects 代码片段

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

            if (err){ 
                console.log('bucket is'+bucket);
                ..........
                .....
            }
            else{
                ....
            }
            ..
            });
Run Code Online (Sandbox Code Playgroud)

Ody*_*eas 9

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

这可以使用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
});
Run Code Online (Sandbox Code Playgroud)

注意:上面使用文件夹的定义意味着至少有一个以文件夹为前缀的键。

要检测“空文件夹”,可以检查文件夹+_$folder$后缀,如此处所述


cap*_*der 5

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

1) 使用 s3.listObjectsV2 方法。

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

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{
                               .....
                    }
....
});
Run Code Online (Sandbox Code Playgroud)