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

时间:2018-10-11 10:29:33

标签: node.js amazon-web-services amazon-s3 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等,但似乎都没有作用

这是我的getObjects代码段

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

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

4 个答案:

答案 0 :(得分:0)

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

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

下面您可以找到现在的简单实现,以编写“检查”功能:

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

希望这会有所帮助。

答案 1 :(得分:0)

我终于找到了解决此问题的方法。如果您的应用程序要求您检查特定对象(“文件夹”)是否存在,并在对象(“文件夹”)实际存在时继续进行操作,则可以使用此解决方案。我相信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{
                               .....
                    }
....
});

答案 2 :(得分:0)

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

这可以使用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所述。

答案 3 :(得分:-1)

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

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