26

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

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

请建议如何实现此功能。

4

4 回答 4

36

您可以在 aws-sdk 中调用getObjector时指定前缀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
});

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

来源:AWS SDK Javascript

于 2018-05-16T09:14:41.887 回答
20

您忘记将文件夹提及到 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")
                })
            }
        })
于 2018-08-28T17:30:00.737 回答
12

从循环中的 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'])        
}
于 2019-04-26T08:36:21.933 回答
1

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

  });
}```
于 2021-10-28T12:51:52.053 回答