Получите 2 объекта S3 и их содержимое, используя всего 1 запрос [C# AWSSDK] - PullRequest
1 голос
/ 05 августа 2020

У меня есть следующее ведро S3 файла:

"BucketName"

  • folder1
    • usa
      • file1.zip
      • file2.zip
    • канада
      • file1.zip
      • file2.zip

Есть ли способ получить содержимое (т.е. перечислить ключи) из пути « BucketName / folder1 / », который даст мне как **usa**, так и **canada** файлы объекта в 1 запросе к S3.

В настоящее время у меня есть следующий код, который делает 2 запроса к S3, которых я пытаюсь избежать, чтобы получить все файлы для каждой из двух стран:

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

1 Ответ

1 голос
/ 06 августа 2020

Amazon S3 не поддерживает получение нескольких диапазонов данных за один запрос GET.

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

Лучше всего чтобы продолжить то, что вы делаете - перебирать ваши объекты и извлекать каждый из них. Это можно сделать одновременно или асинхронно - я бы рекомендовал получать каждый объект из S3 параллельно. Удачи!

...