获取位于特定S3文件夹下的对象的列表

app*_*ppy 9 amazon-s3 node.js aws-sdk aws-sdk-nodejs

我正在尝试使用查询字符串获取S3存储桶中特定文件夹下的对象列表,该查询字符串将文件夹名称作为参数,并使用Node JS aws-sdk列出与该特定文件夹匹配的所有对象

例如:http:// localhost:3000 / listobjects?foldername = xxx

请提出如何实现此功能的建议。

Abh*_*ain 12

您可以在调用aws-sdk getObject或时指定前缀listObjectsV2

var params = {
  Bucket: 'STRING_VALUE', /* required */
  Prefix: 'STRING_VALUE'  // Can be your folder name
};
s3.listObjectsV2(params, function(err, data) {
  if (err) console.log(err, err.stack); // an error occurred
  else     console.log(data);           // successful response
});
Run Code Online (Sandbox Code Playgroud)

顺便说一句,S3没有文件夹。它只是一个前缀。它显示了文件夹结构,使您也可以轻松浏览和查看文件。

来源:AWS SDK Javascript


Tob*_*obi 9

从循环中的 index = 1 开始排除文件夹本身+ 只列出文件夹中的文件:

const s3 = new AWS.S3();

const params = {
    Bucket: bucketname,
    Delimiter: '/',
    Prefix: s3Folder + '/'
};

const data = await s3.listObjects(params).promise();

for (let index = 1; index < data['Contents'].length; index++) {
    console.log(data['Contents'][index]['Key'])        
}
Run Code Online (Sandbox Code Playgroud)

  • 您可以在 params 对象中使用 StartAfter: s3Folder + '/' ,而不是依赖 `index = 1` 来跳过文件夹键。StartAfter 设置起始 S3 键值,允许循环从标准“0”开始迭代。https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#listObjectsV2-property (4认同)

Ami*_*kya 8

您忘了将文件夹提到s3存储桶中,反正这段代码对我有用

var params = {
Bucket:Bucket_Name,
Delimiter: '/',
Prefix: 'foldername/'
};

s3Bucket.listObjects(params, function(err, data) {
            if (err) {
                return 'There was an error viewing your album: ' + err.message
            }else{
                console.log(data.Contents,"<<<all content");

                data.Contents.forEach(function(obj,index){
                    console.log(obj.Key,"<<<file path")
                })
            }
        })
Run Code Online (Sandbox Code Playgroud)

  • 奇迹般有效!重要的是要注意在上面的例子中 Prefix: 'foldername/' 在末尾有 '/'。否则它不起作用。 (2认同)

Aur*_*ana 8

AWS s3 最多提供 1000 个文件列表,以便使用此方法获得超过 1000 个计数

export function getListingS3(prefix) {
  return new Promise((resolve, reject) => {
    try {
      let params = {
        Bucket: AWS_S3.BUCKET_NAME,
        MaxKeys: 1000,
        Prefix: prefix,
        Delimiter: prefix
      };
      const allKeys = [];
      listAllKeys();
      function listAllKeys() {
        s3.listObjectsV2(params, function (err, data) {
          if (err) {
            reject(err)
          } else {
            var contents = data.Contents;
            contents.forEach(function (content) {
              allKeys.push(content.Key);
            });

            if (data.IsTruncated) {
              params.ContinuationToken = data.NextContinuationToken;
              console.log("get further list...");
              listAllKeys();
            } else {
              resolve(allKeys);
            }
          }
        });
      }
    } catch (e) {
      reject(e);
    }

  });
}```
Run Code Online (Sandbox Code Playgroud)