我在S3上创建了两个存储桶,命名为“demobucket”和“demo.bucket”。 当我在“demobucket”上传任何文件时,它工作正常。但是当我在“demo.bucket”上传文件时,它给出了一个错误“达到最大重试次数: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;
}
答案 0 :(得分:1)
当存储桶名称包含句点时,建立与S3的安全连接时出现问题。这里很好地解释了这个问题:http://shlomoswidler.com/2009/08/amazon-s3-gotcha-using-virtual-host.html。
一种解决方案是创建S3客户端,传递第三个参数,使其使用HTTP而不是HTTPS。请参阅Amazon S3 C# SDK "The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel." Error。
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使用您的存储桶路径版本来避免此问题。