Как проанализировать путь AWS S3 (s3: // <имя корзины> / <key>), используя AWSSDK.S3 в C #, чтобы получить имя и ключ корзины - PullRequest
0 голосов
/ 06 июня 2019

У меня есть путь s3 => s3: // [имя корзины] / [ключ]

s3://bn-complete-dev-test/1234567890/renders/Irradiance_A.png 

и мне нужно получить bucket_name и ключ отдельно:

var s3PathParsed = parseS3Path("s3://bn-complete-dev-test/1234567890/renders/Irradiance_A.png");

s3PathParsed.BucketName == "bn-complete-dev-test"
s3PathParsed.Key == "1234567890/renders/Irradiance_A.png"

как правильно разобрать с помощью AWS SDK ?

1) Я выполняю синтаксический анализ вручную (с помощью регулярного выражения), и работает нормально, но мне не комфортно :

public class S3Path : IS3Path
{
    private const string _s3PathRegex = @"[s|S]3:\/\/(?<bucket>[^\/]*)\/(?<key>.*)";

    public S3Path(string s3Path)
    {
        Path = s3Path;

        var rx = new Regex(_s3PathRegex).Match(s3Path);

        if (!rx.Success || rx.Groups.Count != 3)
            throw new Exception($"the S3 Path '{s3Path}' is wrong.");

        BucketName = rx.Groups[1].Value;
        Key = rx.Groups[2].Value;
    }

    public string Path { get; }

    public string BucketName { get; }

    public string Key { get; }
}

2) Я использовал AmazonS3Uri из AWWSDK.S3:

string GetBucketNameFromS3Uri(string s3Uri)
{
    return new AmazonS3Uri(s3Uri).Bucket;            
}

Я назвал метод:

GetBucketNameFromS3Uri("s3://sunsite-complete-dev-test/1234567890/renders/Irradiance_A.png");

и у меня следующая ошибка:

System.ArgumentException: 'Неверный S3 URI - имя хоста не является допустимой конечной точкой S3'

3) Также я стараюсь

string GetBucketNameFromS3Uri(string s3Uri)
{
    return new AmazonS3Uri(new Uri(s3Uri)).Bucket;            
}

с той же ошибкой.

Я создал новую тему на форуме AWS с этой проблемой: https://forums.aws.amazon.com/thread.jspa?threadID=304401

Ответы [ 2 ]

0 голосов
/ 10 июня 2019

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

public class S3Path 
{
    private const string _s3PathRegex = @"[s|S]3:\/\/(?<bucket>[^\/]+)\/(?<key>.+)";

    public S3Path(string s3Path)
    {
        Path = s3Path;

        var rx = new Regex(_s3PathRegex).Match(s3Path);

        if (!rx.Success)
            throw new Exception($"the S3 Path '{s3Path}' is wrong.");

        BucketName = rx.Groups["bucket"].Value;
        Key = rx.Groups["key"].Value;
    }

    public string Path { get; }

    public string BucketName { get; }

    public string Key { get; }
}

Я создал тему на форуме AWS , чтобы сообщить о недостающей функциональности.

0 голосов
/ 06 июня 2019

Я полагаю, что это регулярное выражение даст вам то, что вы хотите:

s3:\/\/(?<bucket>[^\/]*)\/(?<key>.*)

Имя сегмента - это первая часть пути S3, а ключ - все, что находится после первого слеша.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...