[英]AWS S3 - List only root level objects
我有一個具有以下文件夾結構的 S3 存儲桶:
<bucket-name>
folder1/
....
folder2/
....
foldern/
....
這些文件夾中的每一個都有文件,我只想要列出文件夾 1 folder1, folder2 etc.
文件夾 2 folder1, folder2 etc.
的頂級文件夾folder1, folder2 etc.
我發現很多解決方案建議我使用"/"
作為分隔符和一個空前綴,這正是我在下面的 Java 代碼段中嘗試做的:
ListObjectsRequest listObjects = new ListObjectsRequest()
.withDelimiter("/")
.withPrefix("")
.withBucketName(s3BucketName);
ObjectListing objects = s3.listObjects(listObjects);
for (S3ObjectSummary summ : objects.getObjectSummaries()) {
System.out.println(summ.getKey());
}
for 循環仍然不打印任何鍵。 是我做錯了什么,還是根本沒有這樣做?
我設法列出了具有以下內容的頂級文件夾(在 Java 中):
ListObjectsRequest listObjectsRequest = new ListObjectsRequest()
.withBucketName(bucketName)
.withDelimiter("/");
ObjectListing objectListing = client.listObjects(listObjectsRequest);
List<String> commonPrefixes = objectListing.getCommonPrefixes();
您只需要設置分隔符並從公共前綴中讀取。
我目前使用的SDK版本是1.10.14
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.10.14</version>
</dependency>
這是 ac# 版本。 應該很容易移植:
public List<string> GetBucketRootItems(string bucketName, string regionName)
{
List<string> result = new List<string>();
try
{
using (var client = new AmazonS3Client(RegionEndpoint.GetBySystemName(regionName)))
{
ListObjectsV2Request request = new ListObjectsV2Request
{
BucketName = bucketName,
MaxKeys = 10000,
Delimiter = "/",
Prefix = ""
};
ListObjectsV2Response response;
do
{
response = client.ListObjectsV2(request);
result.AddRange(response.CommonPrefixes);
request.ContinuationToken = response.NextContinuationToken;
}
while (response.IsTruncated == true);
}
}
catch (AmazonS3Exception amazonS3Exception)
{
if (amazonS3Exception.ErrorCode != null && (amazonS3Exception.ErrorCode.Equals("InvalidAccessKeyId")
|| amazonS3Exception.ErrorCode.Equals("InvalidSecurity")))
{
log.Error($"Check the provided AWS Credentials.");
}
else
{
log.Error($"Error occurred. Message:'{amazonS3Exception.Message}' when listing objects", amazonS3Exception);
}
}
return result;
}
這似乎有效。 我收到了不到 10000 個條目
如果您需要列出頂級directories
:
public List<String> listTopLevelDirectories(AmazonS3 amazonS3, String bucketName) {
ListObjectsRequest listObjectsRequest = new ListObjectsRequest()
.withBucketName(bucketName)
.withDelimiter("/");
return amazonS3.listObjects(listObjectsRequest).getCommonPrefixes();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.