【AWS】S3へファイルアップロード(PHP)

以前書いた FuelPHPでファイルアップロード の続きで、Amazon S3へアップロードする部分をまとめます。

SDKセットアップ

composerを使ってインストールします。
以下をcomposer.jsonに追加してcomposer installを実行
"aws/aws-sdk-php": "^3.99"

S3へアップロードする処理

名前空間
use \Aws\Credentials\CredentialProvider;
use \Aws\S3\S3Client;
use \Aws\S3\Exception\S3Exception;
処理
  // ①認証情報を取得
  $provider = CredentialProvider::defaultProvider();

  // ②S3Clientを生成
  $s3client = new S3Client([
    'region'      => 'ap-northeast-1',
    'version'     => '2006-03-01',
    'credentials' => $provider,
  ]);

  foreach (Upload::get_files() as $file) {
    // ③URLを決定
    $filename = 'images/'.$file['saved_as'];

    // ④イメージファイルをバイナリモードで開く
    $image = fopen($file['saved_to'].$file['saved_as'], 'rb');

    // ⑤イメージファイルのContentTypeを取得
    $content_type = mime_content_type($file['saved_to'].$file['saved_as']);

    try{
      // ⑥S3へアップロード
      $result = $s3client->putObject(array(
        'Bucket' => 'test-bucket',
        'ACL' => 'private',
        'Key' => $filename,
        'Body' => $image,
        'ContentType' => $content_type,
      ));
    } catch(S3Exception $e){
      // エラー処理
      if($e->getAwsErrorCode() == 'NoSuchBucket'){
        // バケットが見つからない
      } else if($e->getAwsErrorCode() == 'InvalidArgument'){
        // パラメータ不正
      }
    }
  }

①CredentialProvider::defaultProvider()によりAWS認証情報を取得
環境変数、.iniファイル、credentialsの順によしなに取得してくれる。
ローカルで実行する場合はputenvか、Dockerの場合以下をPHPコンテナの設定に追記すれば良い。
  environment:
    AWS_ACCESS_KEY_ID: XXXXXXXXXXXXXX
    AWS_SECRET_ACCESS_KEY: XXXXXXXXXXXXXXXXXXXXXXXXXXXX

②S3Clientを生成
S3に対する操作を行うためのクラス、①で取得した認証情報を指定する

③URLを決定
バケット以下のURLは自由に決定することができる。
これがアップロードするときのKeyになり、同一のKeyが存在した場合は上書き

④ファイルをバイナリモードで開く
イメージファイルのアップロードなのでバイナリモードのリソースが必要になる。
fopenで'rb'を指定すればOK

⑤ファイルのContentTypeを取得
イメージでも複数許可しているので、正しいContentTypeを取得する。

⑥S3へアップロード
バケット名、ACL、③〜⑤で取得した値を設定してアップロードする。
ACLはバケットの属性、(privateやpublicなど)、これが間違っているとアップロードできない。
成功すると$resultにはAws\Resultオブジェクトが入る。
https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.Result.html

エラー処理

エラー発生時はS3Exceptionが発生するので、$e->getAwsErrorCode()により原因が特定できる。

詳細は以下
https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.S3.Exception.S3Exception.html

この記事へのコメント

スポンサーリンク