#はじめに#
Laravelでアプリを作ったのでHerokuで公開してホッとしたのも束の間、どうやらHerokuでは画像の保存ができないらしい・・・。
ということで今回はS3へ画像を保存する方法を取りたいと思います!
初心者の備忘録ですので、理解不足はご容赦ください。
#AWSアカウントの作成#
公式を参考にアカウントを作成しましょう。その際、access keyとsecret access keyが発行されるのでメモっておきましょう。
忘れた場合はこちらを参考にしてみてください。
#S3のバケットを作る#
こちらを参考にバケットを作成してください。ここに画像ファイルが保存されていきます。
その際に、ブロックパブリックアクセスをオフにしてください。
#パッケージのインストール#
最初にAWS SDK for PHPをインストールします。
$ composer require aws/aws-sdk-php
次に、flysystem-aws-s3-v3をインストールしていきます。
$ composer require league/flysystem-aws-s3-v3
laravel8の場合は
$ composer require league/flysystem-aws-s3-v3:^1.0
このようにすることでインストールできます。
この辺りがうまくいかない場合はcomposer.jsonやcomposer.lockをゴニョゴニョする必要があるみたいです。エラーメッセージをよく読んで戦っていきましょう。
#Laravelの設定#
次に.envファイルを編集していきます。
このように書きます。
AWS_ACCESS_KEY_ID=最初に生成されたアクセスキー
AWS_SECRET_ACCESS_KEY=最初に生成されたシークレットアクセスキー
AWS_DEFAULT_REGION=バケットのリージョン
AWS_BUCKET=バケット名
AWS_USE_PATH_STYLE_ENDPOINT=false
これで設定は完了です。
#コントローラーとビューの作成#
次に、コントローラーに画像をアップする処理、ビューに画像を表示する処理を書いていきます。
public function store(Request $request)
{
$item = new Item();
if(empty($errors)){
$img = $request->file('img');
$path = Storage::disk('s3')->putFile('/test', $img,'public');
$item->img = $path;
$item->save();
}
return redirect()->route('home');
}
データベースにはS3に保存された画像のパスが保存されます。
表示はこんな感じです。
{{ Storage::disk('s3')->url("$item->img") }}