パッケージインストール
https://github.com/aws/aws-sdk-php-laravel
Laravel5.0の場合、これの2.xを使う。
"require": {
"aws/aws-sdk-php-laravel": "2.*"
},
⇒ composer update
設定
公式ドキュメント記載の通り、config/app.php
のproviders
, aliases
に追記。
'providers' => array(
'Aws\Laravel\AwsServiceProvider',
)
...
'aliases' => array(
'AWS' => 'Aws\Laravel\AwsFacade',
)
アクセスキー回りも公式ドキュメントの通り.envに書く。
AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXX
AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXXXXX
AWS_REGION=us-west-2
サンプルコード
// postされたファイルを取得
$file = $request->file('my_image');
// S3へアップ
$s3 = App::make('aws')->get('s3');
$result = $s3->putObject(array(
'Bucket' => 'バケット名',
'Key' => 'XXXXX/test.png',
'SourceFile' => $file->getRealPath()
));
おまけ - 実装しながらハマった初歩的なこと
App::が使えない
use Illuminate\Support\Facades\App;
を書かないと使えない。
aws-sdkのcreateClientメソッドがundefined
Usageに、
$s3 = App::make('aws')->createClient('s3');
とあったのでそのままコピペして使おうとしたらメソッドが存在しなかった。
ここはcreateClient
ではなくget
でOK.
入力フォームでファイル選択したのにpostデータがNULL
<form>
にenctype="multipart/form-data"
を指定してなかったのが原因。
bladeで下記のように'files'=> true
を書けば指定できる。
{!! Form::open(array('action' => 'TestController@store', 'files'=> true)) !!}
putObjectは実行できたっぽいけどS3にファイルが上がってない
putObject関数の引数'Key'に、ディレクトリまでのパスしか書いてなかったのが原因。
ファイル名.拡張子
まで指定するとちゃんとアップされる。