LaravelでS3に画像アップロードする方法

プログラミングスクール講師の斉藤です。

今回は、LaravelからAmazon S3に画像ファイルをアップロードする方法について解説いたします。

Amazon S3に関する情報は調べれば多数見つかるのですが、S3について別に詳しくなりたくなくてとりあえず使えればいいというレベルの解説をしているサイトがなかったのでここに残します。

また、記事の最後でGitHubに上げたサンプルプログラムをダウンロードできるようにしておきましたので、よかったらそちらもご参照ください。

やる事の概要

大まかにやる事を先に列挙しておきます。

[st-midasibox title=”AWS” fontawesome=”” bordercolor=”” color=”” bgcolor=”” borderwidth=”” borderradius=”” titleweight=”bold”]

・AWSの管理画面でAmazon S3のバケットを作成する

・バケットのアクセス権限を公開に変更する

[/st-midasibox]

[st-midasibox title=”Laravelプロジェクト” fontawesome=”” bordercolor=”” color=”” bgcolor=”” borderwidth=”” borderradius=”” titleweight=”bold”]

・composerコマンドでflysystem-aws-s3-v3を導入する

・.envファイルにAWSの設定値を設定する

[/st-midasibox]

AWS側の設定

まずはAWS側をいじって、画像ファイルの格納場所を用意します。

Amazon S3でバケットを作成する

Amazon S3でファイルを格納する場所をバケットと呼びます。

初期状態ではバケットは作成されていませんので、AWSの管理画面から作成します。

クリックで大きくなります

バケット名、国名(英語に変換したもの)は後ほどLaravel側の設定項目に使用します。

 

アクセス権限の変更

ここで重要となるのは「アクセス権限」の項目です。

バケットを作成した直後はアクセスが非公開となっており、ここを公開に変更しないと、画像ファイルを格納しても外から見えません

という訳で、以下変更手順です。

バケット名をクリック

アクセス権限のタブを開く

ブロックパブリックアクセスの編集

一番下のみチェックを外す。

 

バケットポリシーの設定

バケットポリシーを設定しなくてはいけないのですが、コピペ用コードを置いたのでバケット名だけ変更してご利用ください。

※コピペしてバケット名だけご自身の内容に変更してください。

 

アクセスキー&シークレットキー

LaravelからS3を使うためには

AWS_ACCESS_KEY_ID

AWS_SECRET_ACCESS_KEY

の情報も必要となります。

 

これらの取得方法はAWSの公式ページを参照してください。

私もこのページの手順通りやって取得できました。

 

Laravel側の設定

AWS側の設定が終わったら、次はLaravel側で設定作業を行います。

flysystem-aws-s3-v3を導入

Laravelプロジェクトの直下で下記のコマンドを実行します。

完了まで数分かかりますのでしばらく放っておいてください。

完了するとfilesystems.phpdiskss3の項目が追加されます。

.envを編集

.envにAWSの設定項目が追加されているので、ここを埋めます。

AWS_DEFAULT_REGIONに設定する値についてはAWSサイトのリージョンエンドポイントをご確認ください。

 

Herokuで利用するには

Herokuにデプロイして利用する際、.envはデプロイされませんので、configコマンドで項目を追加する必要があります。

$ heroku config:set AWS_ACCESS_KEY_ID=[AWSのアクセスキー]

$ heroku config:set AWS_SECRET_ACCESS_KEY=[AWSのシークレットアクセスキー]

$ heroku config:set AWS_DEFAULT_REGION=[AWSで使用している国名]

$ heroku config:set AWS_BUCKET=[S3で作成したバケット名]

Amazon S3を使用するソースコードの書き方

LaravelからAmazon S3へファイルの格納と参照するコードを解説します。

とは言っても、この時点ですでに面倒な設定が完了しているので、あとは普通にStorageを使うだけです。

 

Viewファイル

今回のサンプルでは、View側はinputタグでファイルだけ送信するようにしています。

 

Amazon S3に画像ファイルを格納する

Storage::diskでS3を操作する変数を取得。

putメソッドでS3に保存し、保存したファイル名を取得。

画像までのフルパスを得るにはurlメソッドにファイル名を指定するだけです。

 

ダウンロード

今回解説したサンプルプログラムはGitHub上からダウンロードできます。

https://github.com/SadayoshiSaito/amazon_s3_sample2

 

この記事を書いた人

斉藤 貞義

プロミディア合同会社代表。
会社員として約13年間、ソフトウェア開発の経験を積み2015年にPE-BANKに所属して独立。
システムの受託開発をメインとしながら、プログラミングスクール講師、Udemy講師、アフィリエイトサイト(30代のプログラミングスクール選び)の運営も行っている。