2013-06-05 2 views
0

Я создал два ведра на S3, которые называются «demobucket» и «demo.bucket». Когда я загружаю любой файл на «demobucket», он отлично работает. Но когда я загружаю файл на «demo.bucket», он дает мне ошибку «Максимальное количество попыток повторения попыток: 3»Ошибка при загрузке файла на S3, когда имя ковша, содержащее периоды (точки), с помощью C# SDK

Опасность заключается в том, что проблема с загрузкой файла, ,

Мой код:

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

Я бы добавил имя Bucket в качестве параметра к вашему методу и повторно запустил. Эти 2 ведра находятся под одной учетной записью с одинаковой настройкой? – Mzf

+0

@Mzf: Есть ли разница, если я передаю имя ведра как параметр и статический, как я. И эти 2 ведра находятся под одним и тем же счетом и в том же регионе. –

+0

Хорошо, по моему опыту нет проблем с использованием периодов в имени ведра. – Mzf

ответ

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 
    }; 

Однако имейте в виду, что это не безопасно, и Amazon не рекомендует его использовать. Ваш секретный ключ доступа может быть перехвачен. Я еще не нашел безопасный способ загрузить файл в ведро с периодом в имени.

Если вы используете последнюю версию AWSSDK.dll (по крайней мере, 2.0.13.0), вы можете сделать это вместо того, чтобы:

AmazonS3Config S3Config = new AmazonS3Config() 
    { 
     ServiceURL = "s3.amazonaws.com", 
     ForcePathStyle = true, 
     RegionEndpoint = region 
    }; 

Это заставляет S3Client использовать версию пути к вашему ведре что позволяет избежать проблемы.

+0

за эту информацию ... :) –

Смежные вопросы