Я переписал этот вопрос, чтобы сделать его более ясным, так как я его обновил.
У меня возникли проблемы с 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
.
Так и существует ли объект? Что нужно проверить:
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
.