首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用S3中的AWSSDK.S3解析AWS的C#路径(s3://<bucket name>/< key >)以获得桶名和密钥

如何使用S3中的AWSSDK.S3解析AWS的C#路径(s3://<bucket name>/< key >)以获得桶名和密钥
EN

Stack Overflow用户
提问于 2019-06-06 14:30:36
回答 7查看 15.7K关注 0票数 7

我有一个s3路径=> S3://=>名称/key

代码语言:javascript
运行
复制
s3://bn-complete-dev-test/1234567890/renders/Irradiance_A.png 

我需要分别得到bucket_name和密钥:

代码语言:javascript
运行
复制
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)我正在手动解析(使用正则表达式),工作得很好,但我不喜欢

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
string GetBucketNameFromS3Uri(string s3Uri)
{
    return new AmazonS3Uri(s3Uri).Bucket;            
}

我称这种方法为:

代码语言:javascript
运行
复制
GetBucketNameFromS3Uri("s3://sunsite-complete-dev-test/1234567890/renders/Irradiance_A.png");

我有以下错误:

System.ArgumentException:“无效的S3 URI -主机名似乎不是有效的S3端点”

3)我也试着

代码语言:javascript
运行
复制
string GetBucketNameFromS3Uri(string s3Uri)
{
    return new AmazonS3Uri(new Uri(s3Uri)).Bucket;            
}

也有同样的错误。

我在AWS中创建了一个新的线程,其主题是:https://forums.aws.amazon.com/thread.jspa?threadID=304401

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2020-05-28 13:27:37

如果您有一个对象URL (https://bn-complete-dev-test.s3.eu-west-2.amazonaws.com/1234567890/renders/Irradiance_A.pnlet),则可以使用AmazonS3Uri

代码语言:javascript
运行
复制
// using Amazon.S3.Util

var uri = new AmazonS3Uri(urlString); 

var bucketName = uri.Bucket;
var key = uri.Key;

如果您有一个S3 URI (s3://bn-complete-dev-test/1234567890/renders/Irradiance_A.png),那么它会涉及到更多的内容:

代码语言:javascript
运行
复制
using System;

public static class S3
{
    public static Tuple<string, string> TryParseS3Uri(string x)
    {
        try
        {
            var uri = new Uri(x);

            if (uri.Scheme == "s3")
            {
                var bucket = uri.Host;
                var key = uri.LocalPath.Substring(1);

                return new Tuple<string, string>(bucket, key);
            }

            return null;
        }
        catch (Exception ex)
        {
            var ex2 = ex as UriFormatException;

            if (ex2 == null)
            {
                throw ex;
            }

            return null;
        }
    }
}

下面是一个F#版本:

代码语言:javascript
运行
复制
open System

let tryParseS3Uri (x : string) =
  try
    let uri = Uri x

    if uri.Scheme = "s3"
    then
      let bucket = uri.Host
      let key = uri.LocalPath.Substring 1

      Some (bucket, key)
    else
      None

  with
    | :? UriFormatException -> None
    | exn -> raise exn
票数 6
EN

Stack Overflow用户

发布于 2020-03-17 06:48:32

在Java中,我们可以做这样的事情

代码语言:javascript
运行
复制
AmazonS3URI s3URI = new AmazonS3URI("s3://bucket/folder/object.csv");
S3Object s3Object = s3Client.getObject(s3URI.getBucket(), s3URI.getKey());
票数 13
EN

Stack Overflow用户

发布于 2019-11-18 11:29:28

以下是regex的scala版本和用法。

代码语言:javascript
运行
复制
val regex = "s3a://([^/]*)/(.*)".r
val regex(bucketName, key) = "s3a://my-bucket-name/myrootpath/mychildpath/file.json"

println(bucketName) // my-bucket-name
println(key)        // myrootpath/mychildpath/file.json
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56479718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档