0

我在 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;
    }
4

1 回答 1

1

当存储桶名称包含句点时,建立与 S3 的安全连接时出现问题。这个问题在这里得到了很好的解释:http: //shlomoswidler.com/2009/08/amazon-s3-gotcha-using-virtual-host.html

一种解决方案是创建您的 S3 客户端,并传递第三个参数,使其使用 HTTP 而不是 HTTPS。请参阅Amazon S3 C# 开发工具包“底层连接已关闭:无法为 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 使用您的存储桶的路径版本,从而避免该问题。

于 2014-04-02T19:44:02.307 回答