【问题标题】:S3 listObjects recursively nodeS3 listObjects递归节点
【发布时间】:2021-07-04 08:25:13
【问题描述】:

我想递归地获取 S3 存储桶文件夹中的所有文件。 我想实现与 Linux 中的 ls -R 命令相同的行为。

这是一个插图

my_folder
  |_abc
  | |_abc_file.txt
  | |_xyz
  |   |_xyz_file.txt
  |
  |_file.txt

考虑到上面的目录结构。如果我这样做了

 const data = await s3.listObjectsV2({
    Prefix: 'my_folder/',
    Bucket: bucket,
    Delimiter: `/`,
}).promise();

目前,我收到以下data

-CommonPrefixes: ["abc"]
-Contents:["file.txt"]

预期的行为是:

- Contents: ["abc/abc_file.txt", "abc/xyz/xyz_file.txt", "file.txt"]

我尝试使用 ES6 生成器函数递归函数 来解决这个问题,最终得到了很多混乱的代码。

我正在使用 S3 节点 SDK

【问题讨论】:

  • S3 是flat object store,它不知道任何“文件夹”(并且您不能真正创建“空文件夹”)并且没有递归。您的代码应该可以工作。你实际上是如何存储这个结构的? my_folder_abc 存储的对象是什么?
  • ok 忽略空文件夹。但仍然以递归方式获取文件是一个挑战
  • 当我在“my_folder”中执行 listObjects() 时,我只得到“abc”而不是“abc”中的文件
  • 这很有趣。通常我只会在提供Delimiter 时看到CommonPrefixes 回来。如果您指定前缀,一切都会按预期返回吗?在前缀的末尾添加一个斜杠怎么样?
  • @ZainulAbideen 因为你想要所有文件,而不仅仅是顶级文件,你根本不应该使用delimiter parameter!另见realguess.net/2014/05/24/amazon-s3-delimiter-and-prefix

标签: javascript node.js amazon-web-services amazon-s3 ecmascript-6


【解决方案1】:

Amazon S3 是一个不使用目录的平面对象存储系统。相反,对象的键(文件名)包括对象的完整路径。目录会根据现有对象的路径神奇地“出现”,然后当该路径中没有对象时会消失。

CommonPrefix 与 Amazon S3 等效,显示子目录。

当使用Delimiter 参数(例如Delimiter='/')调用ListObjects() 时,CommonPrefixes 字段中会返回一个子目录列表。这允许像传统存储系统一样通过目录进行递归。如果删除此参数,将返回所有具有给定前缀的对象,而不仅仅是“当前目录”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 2015-09-03
    • 2022-07-08
    • 2017-09-26
    • 2014-03-23
    • 2018-06-21
    • 1970-01-01
    相关资源
    最近更新 更多