【问题标题】:Check if a folder exists on S3 using node js aws-sdk使用节点 js aws-sdk 检查 S3 上是否存在文件夹
【发布时间】:2019-03-16 09:43:58
【问题描述】:

首先,我知道没有文件夹之类的东西,但是,我使用该术语只是为了简单起见。现在我的桶里有很多东西。 对于某些文件夹,我可以使用 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 等,但它们似乎都不起作用

这是我的 getObjects 代码 sn-p

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

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

【问题讨论】:

  • /* 此操作检查存储桶是否存在。 */ var params = { Bucket: "acl1" }; s3.headBucket(params, function(err, data) { if (err) console.log(err, err.stack); // 发生错误 else console.log(data); // 成功响应 });跨度>

标签: node.js amazon-web-services amazon-s3 aws-sdk


【解决方案1】:

headObject 是如何工作不完全的?如果您在 s3 存储桶中搜索目录,它应该返回以下两种内容之一:

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

下面你可以找到一个简单的实现 now 来编写一个“检查”函数:

      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)
      })

希望这会有所帮助。

【讨论】:

  • 不,它给了我错误,即使我将该目录/目录/目录/设置为键,它也存在于 s3 上。这就是我要说的,即使目录存在,这些函数也会给我一个错误
  • 呃……你的桶里有内容吗?考虑到 s3 中的文件夹是一个“虚拟”概念,这意味着它们实际上只是对象键的前缀。更多信息:docs.aws.amazon.com/AmazonS3/latest/user-guide/…
  • 是的,我的存储桶中确实有对象。我知道对象和键的概念,为了简单起见,在问题中使用了术语“文件夹”
  • 抱歉,实际问题是文件夹中是否有任何内容。如果它们是空的,亚马逊只是在创建被许多进程忽略的零长度对象,因此“检查”功能完全有可能也忽略它们。
  • 哦,好的,感谢您的澄清,顺便说一句,该对象确实包含内容。
【解决方案2】:

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

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();
})()

【讨论】:

  • 嗨,Atishay,谢谢,但我实际上是在检查特定目录的存在。
  • 实际上如果目录不存在s3会在推送时自动创建一个
  • 问题是我的目录存在,但是这些函数给我一个错误而不是数据。现在我想检查是否存在,因为我的代码只有在检查存在之后才需要处理,否则什么都不应该做
  • 消息:null,代码:'notfound',区域:null,time:2018-10-11t12:43:55.069z,equiptId:'e480454d2e1215b3',ExtendedRequestId:'Iktzh0t6govkpyvw3bgcjekdzytmzoh1gueejbxzcvrfkiqdjkh0ckieqtt32 + 4amije6ymwixg =', cfId: undefined, statusCode: 404, retryable: false, retryDelay: 54.259656228362594
  • 错误中还有很多其他内容,但字符太多无法上传
【解决方案3】:

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

1) 使用 s3.listObjectsV2 方法。

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

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{
                               .....
                    }
....
});

【讨论】:

    【解决方案4】:

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

    这可以使用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
    });
    

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

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

    【讨论】:

    • 不清楚为什么 headObject 没有表现出其他响应中描述的行为——但这是对我有用的解决方案!
    猜你喜欢
    • 2018-01-23
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 2015-01-14
    • 1970-01-01
    • 2019-11-10
    相关资源
    最近更新 更多