やったこと

webサービスを作るときに考えたことを垂れ流します

【CakePHP3】AWS SDK for PHPでS3サーバーにファイルをアップロード!

AWS SDK for PHP」というアマゾン公式ライブラリを使うと、PHPを使ってアマゾンのS3サーバーにファイルをアップロード・ダウンロードすることができます。

今回は「CakePHP3」でS3サーバーにファイルをアップロードする方法を説明します。


■「AWS SDK for PHP」のインストール
AWS SDK for PHPのインストールは「Composer」を使ってワンタッチでできます。
cakePHP3のディレクトリで以下のコマンドを打つとインストールされます。

  php composer.phar require aws/aws-sdk-php


■ファイルをアップロード
ファイルをアップロードするコードは以下のような感じです。
自分のディレクトリにあるファイル「hogege.jpg」を、S3サーバーにアップップロードしています。

use Aws\S3\S3Client;

public function initialize()
{
   $this->config = [
     's3' => [
       'key' => 'hogehogehogegege', //S3アクセスのためのキー
       'secret' => 'fugafugafugaga', //S3アクセスのためのシークレットキー
       'bucket' => 'image.hogege.com', //S3バケット名
     ]
   ];

   $this->s3 = S3Client::factory([
     'credentials' => [
       'key' => $this->config['s3']['key'],
       'secret' => $this->config['s3']['secret']
     ],
     'region' => 'ap-northeast-1', //リージョンは日本
     'version' => 'latest' //バケットのバージョニングは最新
   ]);
}

public function upload_img($post_id)
{
  //アップロードするファイルのパス
  $filepath = dirname(__FILE__)."/temp/hogege.jpg";

  //AWSに登録するオブジェクト・キー名
  $keyname ="hogege.jpg";

  //アップロード!
  try{
    $result = $this->s3->putObject([
        'Bucket'       => $this->config['s3']['bucket'],
        'Key'          => $keyname,
        'SourceFile'   => $filepath,
        'StorageClass' => 'REDUCED_REDUNDANCY' //低冗長化モードを指定
    ]);
  } catch (Exception $ex) {
    return false;
  }
  return true;
}


ちなみに、他のサイトにあるファイルをかっぱらってきてS3にアップロードする場合は、以下のような感じでできます。

ちゃんとMIMEタイプを指定してあげないといけないのがポイントです。これをしないとMIMEタイプが「application/octet-stream」でアップロードされてしまいます・・。

  //testes.jpgを取得する
  $img_data = file_get_contents("http://fugaga.com/testes.jpg");

  //mime typeを判別
  $finfo = finfo_open(FILEINFO_MIME_TYPE);
  $mime_type = finfo_buffer($finfo, $img_data);
  finfo_close($finfo);

  $keyname = 'testes.jpg';

  //S3にアップロード
  $result = $this->s3->putObject([
    'Bucket'       => $this->config['s3']['bucket'],
    'Key'          => $keyname,
    'Body'         => $img_data,
    'ContentType' => $mime_type,
    'StorageClass' => 'REDUCED_REDUNDANCY' //低冗長化モードを指定
  ]);

アマゾンの公式ページにも詳しい解説が載ってるので、ぜひ見てみてください。
http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/UploadObjSingleOpPHP.html

以上!