【发布时间】: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 因为你想要所有文件,而不仅仅是顶级文件,你根本不应该使用
delimiterparameter!另见realguess.net/2014/05/24/amazon-s3-delimiter-and-prefix
标签: javascript node.js amazon-web-services amazon-s3 ecmascript-6