![](/img/trans.png)
[英]Access selective folders in S3 bucket visa AWS Transfer User
[英]Listing just the sub folders in an s3 bucket
我有一個 s3 結構如下:
s3bucketname -> List of first level keys -> List of second level keys -> List of third level keys -> Actual file.
我需要做的是,給定 s3bucket 的名稱和一級密鑰的條目,我需要位於一級密鑰下的所有二級密鑰的名稱。 所以基本上如果我們把它看成一個文件夾,我會得到root folder
的名稱,即s3bucketname
和它的一個子文件夾subfolder1
的名稱,我想列出 subfolder1 中的所有文件subfolder1
。 不過只是名字,不是完整的路徑。
有人可以指出如何使用亞馬遜的 java sdk 在 java 中做到這一點嗎?
謝謝
我做了以下代碼似乎工作正常,您必須傳遞prefix
並確保前綴以/結尾,並且還指定要獲取子目錄列表的分隔符。 以下應該有效:
public List<String> listKeysInDirectory(String bucketName, String prefix) {
String delimiter = "/";
if (!prefix.endsWith(delimiter)) {
prefix += delimiter;
}
ListObjectsRequest listObjectsRequest = new ListObjectsRequest()
.withBucketName(bucketName).withPrefix(prefix)
.withDelimiter(delimiter);
ObjectListing objects = _client.listObjects(listObjectsRequest);
return objects.getCommonPrefixes();
}
查爾斯版超級簡潔! 謝謝@ charles-menguy
我寫了一個擴展,通過分頁支持巨大的列表。
public List<String> getSubPathsInS3Prefix(String bucketName, String prefix) {
if (!prefix.endsWith(FILE_DELIMITER)) {
prefix += FILE_DELIMITER;
}
List<String> paths = new ArrayList<String>();
ListObjectsRequest listObjectsRequest = new ListObjectsRequest()
.withBucketName(bucketName).withPrefix(prefix)
.withMaxKeys(1000).withDelimiter(FILE_DELIMITER);
ObjectListing currentListing = s3Client.listObjects(listObjectsRequest);
paths.addAll(currentListing.getCommonPrefixes());
while (currentListing == null || currentListing.isTruncated()) {
currentListing = s3Client.listNextBatchOfObjects(currentListing);
paths.addAll(currentListing.getCommonPrefixes());
}
return paths;
}
http://www.lazywiz.com/uncategorized/s3-missing-api-list-sub-paths-in-the-s3-bucket/
重要的是 S3 中沒有真正的文件夾概念。 但是讓我們看看 S3 API 可以使用哪些技巧。
在此示例中,列出了名為“lala”的特定“文件夾”下的所有“子文件夾”(鍵)(沒有該子文件夾的遞歸結構)。
Prefix="lala/" 和 Delimiter="/" 參數發揮了作用。
此外,此解決方案使用 S3 分頁器 API。即使結果包含超過 1000 個對象,該解決方案也會收集所有結果。 S3 分頁器 API 自動解析下一個結果從 1001 到 2000 等等。
# given "folder/key" structure
# .
# ├── lorem.txt
# ├─── lala
# │ ├── folder1
# │ │ ├── file1.txt
# │ │ └── file2.txt
# │ ├── folder2
# │ │ └── file1.txt
# │ └── folder3
# │ └── file1.txt
# └── lorem
# └── folder4
# ├── file1.txt
# └── file2.txt
import boto3
s3 = boto3.client('s3')
paginator = s3.get_paginator('list_objects_v2')
# Execute paginated list_objects_v2
response = paginator.paginate(Bucket="your-bucket-name", Prefix="lala/", Delimiter="/")
# Get prefix for each page result
names = []
for page in response:
names.extend([x["Prefix"] for x in page.get("CommonPrefixes", [])])
print(names)
# Result is:
# ['lala/folder1/','lala/folder2/','lala/folder3/']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.