无法通过 PHP 将图像文件上传到 S3 存储桶

unable to upload image file to S3 bucket via PHP

我正在尝试通过 AWS PHP SDK 将图像上传到我的 S3 存储桶。对于我的 EC2 实例,我附加了一个角色,允许对我的 S3 存储桶使用 PutObject 和 GetObject。因此,据推测,我不需要在创建 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 class 时,引发了 500 内部错误。我可以从 CLI 访问 S3 存储桶,但无法使用 AWS PHP SDK。

错误图片如下:

任何人都可以在这方面提供建议吗?感谢阅读。

根据文档,S3Client Class 的使用是这样的: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);

它还说,“我们不建议在生产应用程序中使用最新版本,因为引入包含 API 更新的 SDK 的新次要版本可能会破坏您的生产应用程序。”

我解决了但是我用的是composer。所以这里有一个分步指南。

这是假设您创建了一个具有完全 S3 访问权限或至少附加了 PutObject 策略的 IAM 角色,并且 IAM 角色附加到 EC2 实例。另外,您的 EC2 实例已安装 Web 服务器。

  1. 在 EC2 实例 /var/www/html(您的 Web 服务器托管网页的文件夹)中,按照 here 的指导在您的项目文件夹中安装 Composer。为了方便起见,我选择全局安装 composer。
  2. 安装 AWS PHP SDK,如此 guide
  3. 如果您遇到请求 simplexml 扩展的错误,只需 yum install php-xml 并重新运行 AWS PHP SDK 的安装。
  4. 现在您已经安装了 SDK,您现在可以将您想要的文件上传到 S3 存储桶。

这是我的上传代码,我的 vendor 文件夹是根目录,包含用于将文件上传到 S3 存储桶的 php 文件。

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