我试图通过.Net / C#访问Amazon S3 API上的外部存储桶。
我已经尝试使用第三方工具登录,它就像一个魅力,现在我想在框架内获取桶的项目。我在代理服务器后面使用它,这就是我使用S3config的原因。
AmazonS3Config S3Config = new AmazonS3Config()
{
CommunicationProtocol = Protocol.HTTP,
ProxyHost = Proxy.Host,
ProxyPort = Convert.ToInt32(Proxy.Port),
ProxyCredentials = new NetworkCredential
{
UserName = Proxy.User,
Password = Proxy.Password
}
};
AmazonS3 S3Client = Amazon.AWSClientFactory.CreateAmazonS3Client(AccessKey, SecretKey,S3Config);
这就是我与亚马逊建立连接的方式。我也尝试过放置
ServiceURL = "s3.amazonaws.com",
进入配置对象初始化程序,因为我在欧盟,而存储桶位于美国的某个地方。
我现在尝试通过以下方式访问:
ListObjectsRequest req = new ListObjectsRequest { BucketName = "yelp-syndication" };
ListObjectsResponse resp = S3Client.ListObjects(req);
或
AmazonS3 client = Amazon.AWSClientFactory.CreateAmazonS3Client(accessKeyID, secretAccessKeyID);
return client.ListBuckets().Buckets.Where(b => b.BucketName == bucket).Single();
或
ListObjectsRequest Request = new ListObjectsRequest
{
BucketName = BucketName
};
ListObjectsResponse Response = S3Client.ListObjects(Request);
我只在被抛出的错误对象中获得Access Denied。 我使用的凭据与第三方工具中的凭证100%相同。
我在这里遗漏了什么吗?我是否需要使用我能找到的任何特殊方式才能使其正常工作?
一个有效的python片段是:
from boto.s3.connection import S3Connection
conn = S3Connection(<ACCESS_KEY_ID>, <SECRET_ACCESS_KEY)
bucket = conn.get_bucket(<BucketName>, validate=False)
这将返回正确的结果,因此实际连接起作用并且还有凭证。
答案 0 :(得分:1)
这是我用来返回&#34;目录中的文件列表的代码&#34;在我的桶里,我知道它肯定有效。我说目录但实际上并没有这样的事情。我对S3的理解是每个文件/文件夹都是一个对象。每个对象都有一个键。键确定树中您将看到文件夹或文件的位置。我相信一个关键的Folder1将是一个名为Folder1的文件夹。具有键Folder1 / File1.txt的对象将是Folder1中的文件。
如果其他聪明人有更多话要说或更正,我相信他们会告诉我。但是,代码确实有效。
public List<string> ListFilesIn(string folder)
{
//I get my values from Orchard CMS but as long as your credentials are correct and can access the bucket this should work a dream.
var settings = new {S3ServiceUrl = "", S3SecretKey="", S3KeyId = "", S3BucketName = ""}
var amazonS3Config = new AmazonS3Config
{
ServiceURL = string.Format("https://{0}", settings.S3ServiceUrl)
};
folder += folder.Substring(folder.Length - 1, 1) == "/" ? "" : "/";
using (var amazonS3Client = new AmazonS3Client(settings.S3KeyId,
settings.S3SecretKey,
amazonS3Config))
{
var response = amazonS3Client.ListObjects(new ListObjectsRequest
{
BucketName = settings.S3BucketName,
Prefix = folder
});
if (response.S3Objects.Count() > 0)
{
return response.S3Objects.Select(s => s.Key).Where(w=>w != folder).ToList();
}
else
{
return new List<string>();
}
}
}
答案 1 :(得分:1)
在使用给定的答案作为研究的新基础后,我发现,我必须在一侧为S3Config类提供serviceurl,regionendpoint和communicationprotocol,因为我知道文件的确切名称在桶中,我需要使用getobject而不是访问存储桶。
所以让我工作的代码是:
AmazonS3Config S3Config = new AmazonS3Config
{
ServiceURL = "s3.amazonaws.com",
RegionEndpoint = RegionEndpoint.USWest2,
CommunicationProtocol = Protocol.HTTPS,
ProxyHost = Proxy.Host,
ProxyPort = Convert.ToInt32(Proxy.Port),
ProxyCredentials = new NetworkCredential
{
UserName = Proxy.User,
Password = Proxy.Password
}
};
_S3Client = AWSClientFactory.CreateAmazonS3Client(AccessKey, SecretKey, S3Config);
_ObjRequest = new GetObjectRequest
{
BucketName = BucketName,
Key = Key
};
_ObjResponse = _S3Client.GetObject(_ObjRequest);
return (_ObjResponse != null);