2014-04-02 3 views
7

Я переписал этот вопрос, чтобы сделать его более ясным, так как я его обновил.Amazon S3 SDK PHP doesObjectExist() проблемы

У меня возникли проблемы с SDK SDS S3 для Amazon AWS. Я просто пытаюсь проверить, существует ли файл. Используя этот скрипт:

<?php 
    require_once("../../../configs/config.".get_current_user().".php"); 
    require INCLUDES_PATH . 'libraries/aws/aws-autoloader.php'; 

    use Aws\S3\S3Client; 

    $client = S3Client::factory(array(
      'key' => AWS_ACCESS_KEY_ID, 
      'secret' => AWS_SECRET_KEY 
    )); 

    $key = 'profile/avatar/80745d03-c295-4205-bd82-58161f2fd2d1-320.jpg'; 
    $result = $client->doesObjectExist(AWS_S3_BUCKET, $key); 

    var_dump(AWS_S3_BUCKET); 
    var_dump($key); 
    var_dump($result); 

?> 

Это выход:

string(19) "stage.socialite.app" 
string(59) "profile/avatar/80745d03-c295-4205-bd82-58161f2fd2d1-320.jpg" 
bool(false) 

Я знаю, что файл существует, он здесь:

http://stage.socialite.app.s3.amazonaws.com/profile/avatar/80745d03-c295-4205-bd82-58161f2fd2d1-320.jpg

Это IAM политика для пользователь, чей идентификатор ключа и секретный ключ я использую:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
    { 
     "Effect": "Allow", 
     "Action": [ 
      "s3:*" 
     ], 
     "Resource": [ 
     "arn:aws:s3:::stage.socialite.app/*", 
     "arn:aws:s3:::stage.socialite.app" 
     ] 
    } 
    ] 
} 

Я только что создал новую пару Key/Secret и добавил их в свой конфиг - что я сделал неправильно?

ответ

2

Я нашел ответ на другой SO отправить, в комментарии от Carlos Castillo:

AWS PHP SDK Version 2 S3 filename encoding issue

Он указал мне в направлении Github Issue, который предложил установке региона при инициализации клиента S3, это потому, что я использую экземпляр S3 в Ирландии для моего dev-сервера, а не для серверов по умолчанию по умолчанию.

Так что это решение:

$client = S3Client::factory(array(
    'key' => AWS_ACCESS_KEY_ID, 
    'secret' => AWS_SECRET_KEY, 
    'region' => AWS_S3_REGION 
)); 

Где AWS_S3_REGION постоянный набор в моем файле конфигурации, как ключ и секрет.

Заслуга neilscastle, Карлос и переполнения стека для него это отличный SEO

+2

Ах, место в ковше, являющееся проблемой, имеет смысл. –

5

Если var_dump() говорит bool(false) или bool(true), то он корректно возвращает логическое значение. print_r() не содержит подробную информацию о типе и возвращает пустую строку для значений false и null.

И действительно ли объект существует? Что необходимо проверить:

  • Ключи S3 не имеют ведущих косых черт. Согласно вашему коду и выходу выше, я подозреваю, что это проблема.
  • Убедитесь, что вы указали фактическое имя ведра S3, а не имя распространения CloudFront.
  • doesObjectExist() возвращает false, если пользователь не имеет прав на чтение для этого объекта.
+1

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

+1

Для меня проблема была ведущей косой чертой, удалив ее, решив ее! – mathielo

2

Кроме того, чтобы исправить расположение ведра и разрешения на чтение:

При использовании на стороне сервера шифрования, необходимые для обеспечения возможности SSE с doesObjectExist ,

$s3Client->doesObjectExist($bucket, $key, array(
    'SSECustomerAlgorithm' => 'AES256', 
    'SSECustomerKey'  => $encryptionKey, 
    'SSECustomerKeyMD5' => md5($encryptionKey, true) 
)); 

Отсутствующие или неправильные варианты SSE даст false отдачу от doesObjectExist.

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