gpt4 book ai didi

java - Amazon S3 客户端未列出存储桶中的所有文件夹

转载 作者:行者123 更新时间:2023-11-29 07:26:21 27 4
gpt4 key购买 nike

我正在尝试列出 s3 存储桶中所有所谓的文件夹子文件夹。现在,当我试图递归地列出路径中的所有文件夹时,我没有使用 withDelimeter() 函数。所有所谓的文件夹名称都应该以/结尾,这是我列出所有文件夹和子文件夹的逻辑。

这是 scala 代码(有意不在此处粘贴 catch 代码):

val awsCredentials = new BasicAWSCredentials(awsKey, awsSecretKey)
val client = new AmazonS3Client(awsCredentials)
def listFoldersRecursively(bucketName: String, fullPath: String): List[String] = {
try {
val objects = client.listObjects(bucketName).getObjectSummaries
val listObjectsRequest = new ListObjectsRequest()
.withPrefix(fullPath)
.withBucketName(bucketName)
val folderPaths = client
.listObjects(listObjectsRequest)
.getObjectSummaries()
.map(_.getKey)
folderPaths.filter(_.endsWith("/")).toList
}
}

Here's the structure of my bucket through an s3 client

Here's the list I am getting using this scala code

在没有任何明显模式的情况下,检索到的文件夹列表中缺少许多文件夹。我没用过

client.listObjects(listObjectsRequest).getCommonPrefixes.toList

因为它出于某种原因返回空列表。

P.S: 由于是新用户,无法直接在帖子中添加照片。

最佳答案

Without any apparent pattern, many folders are missing from the list of retrieved folders.

这是您的问题:您假设应该始终存在键以 / 结尾的对象来表示文件夹。

这是一个错误的假设。它们只有在您通过 S3 控制台或 API 创建它们时才会存在。没有理由期待它们,因为 S3 实际上并不需要它们或将它们用于任何事情,而且 S3 服务本身不会自发地创建它们。

如果您使用 API 上传带有键 foo/bar.txt 的对象,这不会将 foo/ 文件夹创建为一个不同的对象。为方便起见,它将在控制台中显示为一个文件夹,但除非您在某个时候有意创建它,否则它不存在。

当然,使用控制台上传此类对象的唯一方法是“创建”文件夹,除非它已经出现——但出现在控制台不一定等同于作为一个独特的对象存在。

过滤 endsWith("/") 是无效逻辑。

如果指定了 delimiterprefix,这就是底层 API 在每个 ListObjects 响应中包含 CommonPrefixes 的原因。这是下一级“文件夹”的列表,您必须递归向下钻取以找到下一级。

If you specify a prefix, all keys that contain the same string between the prefix and the first occurrence of the delimiter after the prefix are grouped under a single result element called CommonPrefixes. If you don't specify the prefix parameter, the substring starts at the beginning of the key. The keys that are grouped under the CommonPrefixes result element are not returned elsewhere in the response.

https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html

您需要使用您或使用的任何库来访问此功能,或者,您需要迭代整个键列表并使用字符串拆分发现 / 边界上的实际公共(public)前缀。

关于java - Amazon S3 客户端未列出存储桶中的所有文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52037187/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com