【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コンテナの設定に追記すればOKです。

  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

コメント

このブログの人気の投稿

docker-compose up で proxyconnect tcp: dial tcp: lookup proxy.example.com: no such host

docker-compose で起動したweb、MySQLに接続できない事象

【PHP】PHP_CodeSnifferを使う(コーディングルールのカスタマイズ)