LaravelでAWSのS3にファイルをアップロードするための基本的な設定を説明します。
下記関連ページでは画像自体をローカルストレージに保存し、そのパスをデータベースに保存しました。画像を画面に表示させる場合はそのパスを利用しています。本記事では、画像の保存先をS3に変更するだけで基本的な実装は全く同じ前提で話を進めますので、アプリケーションの構築方法は下記ページをご覧下さい。
関連ページ
Laravel Vue.jsで画像をアップロード DB保存までの流れ
※またAWSのIAMユーザーおよびS3のバケットは作成済みであることを前提としています。
S3のバケット作成についてはこちら
まず .env ファイルの下記項目を設定する必要があります。この設定自体はconfig/filesystems.phpに反映されます。
1 2 3 4 |
AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= AWS_DEFAULT_REGION=ap-northeast-1 AWS_BUCKET= |
「AWS_DEFAULT_REGION」にはバケットを作成したリージョン名を設定します。アジアパシフィック(東京)を選択した場合は上記のようになります。「AWS_BUCKET」には作成済みのバケット名を設定します。
「AWS_ACCESS_KEY_ID(アクセスキー)」と「AWS_SECRET_ACCESS_KEY(シークレットアクセスキー)」を作成し取得してみます。
IAMのダッシュボードの「ユーザー」を選択します。
ユーザー名を選択します。
「認証情報」タブを選択して、「アクセスキーの作成」ボタンをクリックします。
下記のような画面が表示され「アクセスキー」と「シークレットアクセスキー」を取得することができます。
.envファイルを編集したらキャッシュをクリアして下さい。
1 |
$ php artisan config:cache |
次にローカルのファイルシステムとS3を操作するためのパッケージをインストールする必要があります。
1 |
$ composer require league/flysystem-aws-s3-v3 ~1.0 |
以上で環境設定は完了です。
最後に上述した関連ページ先の変更部分だけを説明します。先にも述べたようにファイルの保存先をS3に変更するだけで動きます。
app/Http/Controllers/ImageApiController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Image; use Storage; 〜省略 public function store(Request $request) { $this->validate($request, [ 'title' => 'required|max:7', 'file' => 'required|image' ], [ 'title.required' => 'タイトルを入力して下さい', 'title.max' => '7文字以内で入力して下さい', 'file.required' => '画像が選択されていません', 'file.image' => '画像ファイルではありません', ]); if (request()->file) { $image = $request->file('file'); $path = Storage::disk('s3')->put('/', $image, 'public'); $image = new Image(); $image->path = Storage::disk('s3')->url($path);; $image->title = $request->title; $image->save(); return ['success' => '登録しました!']; } } 〜省略 |
25行目
StorageファザードでS3につなぎ、putメソッドを利用してファイルをアップロードしています。第1引数にはアップロード先のディレクトリ、第2引数にはフォームから受け取ったファイルデータ、第3引数には外部からアクセスできるようにpublicを指定しています。
28行目
アップロードした画像のURLを取得し、DBに保存しています。
参照ページ