首页 > 解决方案 > S3 listObjects递归节点

问题描述

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

这是一个插图

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

标签: javascriptnode.jsamazon-web-servicesamazon-s3ecmascript-6

解决方案


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

ACommonPrefix是显示子目录的 Amazon S3 等效项。

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


推荐阅读