Проблемы с Amazon S3 SDK PHP doObjectExist ()

Я переписал этот вопрос, чтобы сделать его более ясным, так как я его обновил.

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

<?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://img.ruphp.com/php/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 и добавил их в свой конфиг – что я сделал неправильно?

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

Так и существует ли объект? Что нужно проверить:

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

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

Проблема с кодировкой имени файла S3 AWS PHP SDK версии 2

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

Итак, это решение:

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

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

Кредит идет в neilscastle , Carlos и Stack Overflow, потому что это отличный SEO

В дополнение к правильному расположению ковша и разрешениям на чтение:

Если вы используете шифрование на стороне сервера, вам необходимо предоставить опции SSE с помощью doesObjectExist .

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

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