невозможно загрузить файл изображения в корзину S3 через PHP

Я пытаюсь загрузить изображение в свой S3 Bucket с помощью AWS PHP SDK. Для моего экземпляра EC2 я прикрепил роль, которая разрешает PutObject и GetObject для моего S3 Bucket. Следовательно, якобы мне не нужно прикреплять учетные данные при создании S3Client. Я еще учусь.

Вот мой скрипт PHP:

<?php
require './aws/aws-autoloader.php';

use Aws\S3\S3Client;
use Aws\Exception\AwsException;
use Aws\Credentials\Credentials;

$s3 = new Aws\S3\S3Client([
    'version' => 'latest',
    'region' => 'us-east-1'
]);

$filename = $_FILES['file']['name'];

try {
    $result = $s3->putObject([
        'Bucket' => 'bucket name',
        'Key' => 'testimage1',
        'Body' => $filename
    ]);
    echo 'DONE';
} catch (Exception $e) {
    echo $e;
}

Я постоянно получаю внутреннюю ошибку 500 в этой форме. Видимо ошибка возникает при создании S3Client, не знаю почему.

Дальнейшее зондирование подтверждает, что когда я пытаюсь создать экземпляр класса S3Client, выдается внутренняя ошибка 500. Я могу получить доступ к корзине S3 из интерфейса командной строки, но не могу сделать это с помощью AWS PHP SDK.

Вот изображение ошибки:  изображение ошибки

Может ли кто-нибудь посоветовать в этом? Спасибо за чтение.


person cswannabe    schedule 29.04.2021    source источник
comment
А в чем именно ошибка?   -  person pdu    schedule 29.04.2021
comment
@pdu, обновил пост с ошибкой.   -  person cswannabe    schedule 29.04.2021
comment
Ошибка 500 может быть практически любой, попробуйте прочитать журналы ошибок сервера, комментировать части кода, сделать запрос через почтальон и т. Д., Чтобы узнать, что может быть не так.   -  person Justinas    schedule 29.04.2021
comment
Похоже, что создание экземпляра S3Client вызывает внутреннюю ошибку 500. Я все еще не уверен, почему, у кого-нибудь есть опыт здесь? Я предоставил экземпляру EC2 полный доступ к корзине S3.   -  person cswannabe    schedule 29.04.2021


Ответы (2)


Согласно документации, использование класса S3Client выглядит следующим образом: https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/guide_configuration.html

use Aws\S3\S3Client;

$options = [
    'region'            => 'us-east-1',
    'version'           => '2006-03-01',
    'signature_version' => 'v4'
];

$s3Client = new S3Client($options);

В нем также говорится: «Мы не рекомендуем использовать последнюю версию в производственном приложении, потому что установка новой дополнительной версии SDK, включающей обновление API, может привести к поломке вашего производственного приложения».

person Howard E    schedule 29.04.2021
comment
Я изменил версию, но ошибка не исчезла. - person cswannabe; 29.04.2021
comment
Вы перешли на $s3Client = new S3Client - person Howard E; 29.04.2021
comment
Да, я так и сделал. Это могла быть ошибка с назначением роли IAM. Я вернусь. - person cswannabe; 29.04.2021
comment
Нет, похоже, это не роль IAM, я дал ей полный доступ к ведру S3. Я могу получить доступ к ведру S3 из командной строки. - person cswannabe; 29.04.2021
comment
Я тупица. Это была проблема с путями, которую можно было легко решить, если бы я просто использовал композитор. - person cswannabe; 30.04.2021

Я решил, но использовал композитор. Итак, вот пошаговое руководство.

Это сделано при предположении, что вы создали роль IAM с полным доступом S3 или, по крайней мере, с прикрепленной политикой PutObject, а роль IAM прикреплена к экземпляру EC2. Также, что ваш экземпляр EC2 установил веб-сервер.

  1. В экземпляре EC2 /var/www/html (папка, в которой ваш веб-сервер размещает вашу веб-страницу) установите composer в соответствии с инструкциями по здесь в папке вашего проекта. Для удобства я выбрал глобальную установку composer.
  2. Установите AWS PHP SDK, как показано в этом руководство.
  3. Если вы столкнулись с ошибкой, запрашивающей расширение simplexml, просто yum install php-xml и повторно запустите установку AWS PHP SDK.
  4. Теперь, когда у вас установлен SDK, вы можете загрузить нужный файл в корзину S3.

Вот мой код для загрузки, моя папка поставщика находится на корневом уровне с файлом php, используемым для загрузки файлов в корзину S3.

require 'vendor/autoload.php';

use Aws\S3\S3Client;

try{
  $sharedConfig = [
      'region' => 'us-east-1',
      'version' => 'latest'
  ];

  $sdk = new Aws\Sdk($sharedConfig); /*Instantiate SDK class with configs for API use*/

  $s3Client = $sdk->createS3(); /*creates the S3 Client for API use*/

  $file_name = $_FILES['file']['name']; /*file name e.g. name.jpg */

  $file_tmp_name = $_FILES['file']['tmp_name']; /*!!! IMPORTANT - this is what you need to supply the SourceFile to properly upload the file*/

  $file_type = $_FILES['file']['type']; /*file type*/

  /*print_r($_FILES['file']);*/
  $result = $s3Client->putObject([
    'Bucket' => 'bucket-name',
    'Key' => 'testimage.jpg',
    'SourceFile' => $file_tmp_name,
    'ContentType'=>$file_type,
    'ContentDisposition'=>'attachment'
  ]);
  echo "FILE SENT";
}catch(Exception $e){
  echo $e;
}
person cswannabe    schedule 29.04.2021