Laravel 5.4/5.5でS3ファイルアップロード

# ゴール
Laravelを使って、S3に画像ファイルをアップロード。

# 参考資料
* [Laravel 5.4 公式サイト](https://laravel.com/docs/5.4/filesystem)
* [Laravel 5.3　AWS S3にファイルをアップロード](http://www.larajapan.com/2016/10/09/laravel-5-3%E3%80%80aws-s3%E3%81%AB%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89/)

# 作業開始
## Laravel編集
### Larval 5.4 composer.json
```composer.json
{
    "name": "laravel/laravel",
    "description": "The Laravel Framework.",
    "keywords": ["framework", "laravel"],
    "license": "MIT",
    "type": "project",
    "require": {
        "php": ">=5.6.4",
        "laravel/framework": "5.4.*",
        "laravel/tinker": "~1.0",
        "laravelcollective/html": "~5.2",
        "league/flysystem-aws-s3-v3" : "~1.0"
    },
...省略
```

### Larval 5.5 composer.json
```composer.json
{
    "name": "laravel/laravel",
    "description": "The Laravel Framework.",
    "keywords": ["framework", "laravel"],
    "license": "MIT",
    "type": "project",
    "require": {
        "php": ">=7.0.0",
        "fideloper/proxy": "~3.3",
        "laravel/framework": "5.5.*",
        "laravel/tinker": "~1.0",
        "league/flysystem-aws-s3-v3" : "~1.0"
    },

```

### filesystems.php
```filesystems.php
...省略
    'disks' => [

        'local' => [
            'driver' => 'local',
            'root' => storage_path('app'),
        ],

        'public' => [
            'driver' => 'local',
            'root' => storage_path('app/public'),
            'url' => env('APP_URL').'/storage',
            'visibility' => 'public',
        ],

        's3' => [
            'driver' => 's3',
            'key' => env('AWS_KEY'),
            'secret' => env('AWS_SECRET'),
            'region' => env('AWS_REGION'),
            'bucket' => env('AWS_BUCKET'),
        ],

    ],
```
AWS認証情報はenv('AWS_SECRET')で取っているので、.envに保存されている。
直接こちらfilesystems.phpにKeyを入れたらNG。これからパスワードはずっとGithubに保存されてしまう。

### .env
.envに下記記述を追加：（パスワードは適宜に入れてね）

```.env
AWS_KEY=AKI****
AWS_SECRET=****
AWS_REGION=us-east-1
AWS_BUCKET=***-test
```

### Laravelソースコード
```PhotoController.php
class PhotoController extends Controller
...
    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        echo "zzzzz01 : aaaaa store 01";
        //Save Photo
        if ($request->hasFile('image_01')) {
            $path = $request->image_01->store('profiles', 's3');
            var_dump($path);
        }
    }
```

### 実行結果：
```実行結果
zzzzz01 : aaaaa store 01string(54) "profiles/JlaRMuuWdOJYlbV2MWqYBR9k6XlnZ38OOtXHUk91.jpeg"
```

S3側
<img width="623" alt="スクリーンショット 2017-03-11 23.26.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/133516/c992bc1c-de43-92c5-20aa-581165a4e88c.png">
/***-test/profiles/JlaRMuuWdOJYlbV2MWqYBR9k6XlnZ38OOtXHUk91.jpegが生成された。

##エンハンスメント
上記ソースコードでは、アップロードした画像は非公開状態。
Webサイト用にアップロードするなら、デフォルトを公開で設定したい。

```公開
    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        echo "zzzzz01 : aaaaa store 01";
        //Save Photo
        if ($request->hasFile('image_01')) {
            $path = Storage::disk('s3')->putFile('profiles', $request->image_01, 'public'); // Ｓ３にアップ
            echo "\npath=" . $path;
            $url = Storage::disk('s3')->url($path);
            echo "\nurl=" . $url;
            echo "\n";
        }
    }

```
```Output
zzzzz01 : aaaaa store 01 
path=profiles/R9cs2lgM7G***.jpeg 
url=https://s3.amazonaws.com/***-test/profiles/R9cs2lgM7G***.jpeg
```


Yeah!
Laravel素晴らしい