首页 > 解决方案 > 仅使用 1 个请求检索 2 个 S3 对象及其内容 [C# AWSSDK]

问题描述

我有以下文件 S3 存储桶:

“桶名”

有没有一种方法可以从“ BucketName/folder1/ ”路径中检索内容(即列出键),这将在对 S3 的 1 个请求中为我提供对象文件**usa****canada**对象文件。

目前,我有以下代码向 S3 发出 2 个请求,我试图避免检索这两个国家/地区的所有文件:

public List<string> GetShapefiles(string country)
{

    var s3Request = new ListObjectsV2Request
    {
        BucketName = BucketName,
        Delimiter = "/"
    };

    if (country == "US")
    {
        s3Request.Prefix = "BucketName/folder1/usa/";

        return GetShapeFileList(s3Request);
    }

    else if (country == "Canada")
    {
        s3Request.Prefix = "BucketName/folder1/canada/";

        return GetShapeFileList(s3Request);
    }

}

    private List<string> GetShapeFileList(ListObjectsV2Request request)
{
    var result = new List<string>();
    ListObjectsV2Response response;

        do
        {
            response = S3_CLIENT.ListObjectsV2Async(request).Result;

            foreach (var file in response.S3Objects.Where(f => f.Key.LastIndexOf('/') != f.Key.Length - 1))
            {
                result.Add(file.Key);
            }

            request.ContinuationToken = response.NextContinuationToken;
        } while (response.IsTruncated);

        return result;
}

因此,理想情况下,我只想提出 1 个请求,为我提供美国和加拿大的所有 zip 文件,如下所示:

/usa/file1.zip
/usa/file2.zip
/canada/file1.zip
/canada/file2.zip

标签: c#amazon-s3.net-coreaws-sdk

解决方案


Amazon S3 不支持每个 GET 请求检索多个数据范围。

    -    https://docs.aws.amazon.com/AmazonS3/latest/dev/GettingObjectsUsingAPIs.html

你最好的选择是继续你正在做的事情——遍历你的对象并检索每个对象。这可以同时或异步完成 - 我建议从 S3 并行获取每个对象。祝你好运!


推荐阅读