Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用C#中的AWSSDK.S3解析AWS S3路径(S3://<;bucket name>;//<;key>;),以获取bucket name&;钥匙_C#_Amazon S3_Aws Sdk - Fatal编程技术网

如何使用C#中的AWSSDK.S3解析AWS S3路径(S3://<;bucket name>;//<;key>;),以获取bucket name&;钥匙

如何使用C#中的AWSSDK.S3解析AWS S3路径(S3://<;bucket name>;//<;key>;),以获取bucket name&;钥匙,c#,amazon-s3,aws-sdk,C#,Amazon S3,Aws Sdk,我有一个s3路径=>s3://[bucket name]/[key] s3://bn-complete-dev-test/1234567890/renders/Irradiance_A.png 我需要分别获取bucket_名称和密钥: var s3PathParsed = parseS3Path("s3://bn-complete-dev-test/1234567890/renders/Irradiance_A.png"); s3PathParsed.BucketName == "bn-c

我有一个s3路径=>s3://[bucket name]/[key]

s3://bn-complete-dev-test/1234567890/renders/Irradiance_A.png 
我需要分别获取bucket_名称和密钥:

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; }
}
我把这个方法叫做:

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论坛上创建了一个新的主题:

我相信这个正则表达式会满足您的需求:

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

bucketname是S3路径的第一部分,键是第一个正斜杠后的所有内容。

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; }
}
公共类路径
{
private const string_s3PathRegex=@“[s|s]3:\/\/(?[^\/]+)\/(?。+)”;
公共S3Path(字符串S3Path)
{
Path=s3Path;
var rx=新正则表达式(_s3PathRegex).Match(s3Path);
如果(!rx.Success)
抛出新异常($“S3路径{s3Path}错误。”);
BucketName=rx.Groups[“bucket”].Value;
键=接收组[“键”]值;
}
公共字符串路径{get;}
公共字符串BucketName{get;}
公共字符串密钥{get;}
}

报告缺少的功能。

以下是scala版本和正则表达式的用法

val regex=“s3a://([^/]*)/(.*)”.r
val regex(bucketName,key)=“s3a://my bucket name/myrootpath/mychildpath/file.json”
println(bucketName)//我的bucket名称
println(key)//myrootpath/mychildpath/file.json

在Java中,我们可以执行以下操作

AmazonS3URI s3URI = new AmazonS3URI("s3://bucket/folder/object.csv");
S3Object s3Object = s3Client.getObject(s3URI.getBucket(), s3URI.getKey());
如果您有一个对象URL(
https://bn-complete-dev-test.s3.eu-west-2.amazonaws.com/1234567890/renders/Irradiance_A.pnlet
),您可以使用:

//使用Amazon.S3.Util
var uri=新的AmazonS3Uri(urlString);
var bucketName=uri.Bucket;
var key=uri.key;
如果您有一个S3URI(
S3://bn complete dev test/1234567890/renders/Irradiance_A.png
),那么它就更复杂了:

使用系统;
公共静态类S3
{
公共静态元组TryParseS3Uri(字符串x)
{
尝试
{
var uri=新uri(x);
如果(uri.Scheme==“s3”)
{
var bucket=uri.Host;
var key=uri.LocalPath.Substring(1);
返回新元组(bucket,key);
}
返回null;
}
捕获(例外情况除外)
{
var ex2=ex作为UriFormatException;
如果(ex2==null)
{
掷骰子;
}
返回null;
}
}
}
以下是F#版本:

开放系统
让tryparse3uri(x:string)=
尝试
设uri=urix
如果uri.Scheme=“s3”
然后
让bucket=uri.Host
让key=uri.LocalPath.Substring 1
一些(桶、钥匙)
其他的
没有一个
具有
| :? UriFormatException->None
|exn->raise exn

对于可以使用的Javascript版本


AWSSDK.S3 Nuget库有一个实用方法:

if (!Amazon.S3.Util.AmazonS3Uri.TryParseAmazonS3Uri(s3Url, out AmazonS3Uri amazonS3Uri))
  throw new ArgumentOutOfRangeException();
var bucket = amazonS3Uri.Bucket;
var key = amazonS3Uri.Key;
var region = amazonS3Uri.Region;

显然,您使用的S3URI存在问题。您可以更新您的问题以包含实际的URI吗?它应该类似于
https://bucket.s3-aws-region.amazonaws.com/key
。我需要解析S3路径(S3:///),而不是对象的URL。fyi因为
S3://
是一个URL,您可以使用您选择的语言使用URL解析器。我希望避免使用手动解决方案,如正则表达式,因为这是一种手动方法,我想使用AWS SDK for S3不幸的是,我认为您不会在Amazon SDK中提交解决方案,因为它似乎期望
http://bucket.s3.aws-region.amazonaws.com/Key
其格式是的,我同意。AWS SDK目前没有该功能。您不能将
rx.Success==true
rx.Groups.Count
设置为3以外的任何值。否则它将与正则表达式不匹配。此外,命名组的整个要点是,您可以使用
rx.groups[“Bucket”].Value
rx.groups[“Key”].Value
。怎么办?不知道存在帮助对象。好主意。这在Java中真的有效吗?因为在.NET中,它抛出了一个异常
无效的S3URI-主机名似乎不是有效的S3端点
。我猜itt只适用于http(s)URL,这是有道理的,因为URI不必包含协议。亚马逊不考虑这一点有点傻。这不适用于像“S3://bn complete dev test/1234567890/renders/辐照度A.png”这样的S3路径。它只适用于对象的URL。@Trispid Good point。为此,我们可以使用标准库中的
Uri
类。
const AmazonS3URI = require('amazon-s3-uri')
 
try {
  const uri = 'https://bucket.s3-aws-region.amazonaws.com/key'
  const { region, bucket, key } = AmazonS3URI(uri)
} catch((err) => {
  console.warn(`${uri} is not a valid S3 uri`) // should not happen because `uri` is valid in that example
})
if (!Amazon.S3.Util.AmazonS3Uri.TryParseAmazonS3Uri(s3Url, out AmazonS3Uri amazonS3Uri))
  throw new ArgumentOutOfRangeException();
var bucket = amazonS3Uri.Bucket;
var key = amazonS3Uri.Key;
var region = amazonS3Uri.Region;