簡體   English   中英

AWS S3 - 僅列出根級對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM