LoginSignup
32
33

More than 5 years have passed since last update.

Laravel5.0でAWS S3にファイルアップロード

Posted at

パッケージインストール

https://github.com/aws/aws-sdk-php-laravel
Laravel5.0の場合、これの2.xを使う。

composer.json
  "require": {
    "aws/aws-sdk-php-laravel": "2.*"
  },

⇒ composer update

設定

公式ドキュメント記載の通り、config/app.phpproviders, aliasesに追記。

app.php
    'providers' => array(
        'Aws\Laravel\AwsServiceProvider',
    )

    ...

    'aliases' => array(
        'AWS' => 'Aws\Laravel\AwsFacade',
    )

アクセスキー回りも公式ドキュメントの通り.envに書く。

.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'に、ディレクトリまでのパスしか書いてなかったのが原因。

ファイル名.拡張子 まで指定するとちゃんとアップされる。

32
33
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
32
33