通过c# SDK在S3上上传桶名包含点号(点)时出错
本文关键字:出错 包含点 SDK S3 通过 | 更新日期: 2023-09-27 18:16:56
我在S3上创建了两个bucket,分别命名为"demobucket"answers"demo.bucket"。当我在"demobucket"上上传任何文件时,它工作得很好。但是当我上传文件到demo。,它给我一个错误"最大重试次数达到:3"
我关心的是,当桶名包含句号(点)时,上传文件会出现什么问题。
我的代码是:public static bool UploadResumeFileToS3(string uploadAsFileName, Stream ImageStream, S3CannedACL filePermission, S3StorageClass storageType)
{
try
{
AmazonS3 client = Amazon.AWSClientFactory.CreateAmazonS3Client(MY_AWS_ACCESS_KEY_ID, MY_AWS_SECRET_KEY);
PutObjectRequest request = new PutObjectRequest();
request.WithKey(uploadAsFileName);
request.WithInputStream(ImageStream);
request.WithBucketName("demo.bucket");
request.CannedACL = filePermission;
request.StorageClass = storageType;
client.PutObject(request);
client.Dispose();
}
catch
{
return false;
}
return true;
}
当桶名包含句号时,建立到S3的安全连接出现问题。这个问题在这里解释得很好:http://shlomoswidler.com/2009/08/amazon-s3-gotcha-using-virtual-host.html.
一个解决方案是创建S3客户端,传递第三个参数,使其使用HTTP而不是HTTPS。查看Amazon S3 c# SDK"底层连接已关闭:无法为SSL/TLS安全通道建立信任关系";错误。
AmazonS3Config S3Config = new AmazonS3Config()
{
ServiceURL = "s3.amazonaws.com",
CommunicationProtocol = Protocol.HTTP,
RegionEndpoint = region
};
但是,请注意,这是不安全的,亚马逊不建议这样做。你的密匙可能会被截获。我还没有找到一种安全的方法来将文件上传到名称中带有句点的桶。
如果您使用的是最新版本的AWSSDK.dll(至少2.0.13.0),您可以这样做:
AmazonS3Config S3Config = new AmazonS3Config()
{
ServiceURL = "s3.amazonaws.com",
ForcePathStyle = true,
RegionEndpoint = region
};
这将强制S3Client使用桶路径的版本,从而避免了这个问题。