AWS
S3
laravel
5.4

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

ゴール

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

参考資料

作業開始

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に下記記述を追加:(パスワードは適宜に入れてね)

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側
スクリーンショット 2017-03-11 23.26.33.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'); // S3にアップ
            echo "\npath=" . $path;
            $url = Storage::disk('s3')->url($path);
            echo "\nurl=" . $url;
            echo "\n";
        }
    }

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

Yeah!
Laravel素晴らしい