3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Laravel+Amazon S3 画像をアップする方法

Last updated at Posted at 2021-10-10

#はじめに#
 Laravelでアプリを作ったのでHerokuで公開してホッとしたのも束の間、どうやらHerokuでは画像の保存ができないらしい・・・。
ということで今回はS3へ画像を保存する方法を取りたいと思います!
初心者の備忘録ですので、理解不足はご容赦ください。

#AWSアカウントの作成#
 公式を参考にアカウントを作成しましょう。その際、access keyとsecret access keyが発行されるのでメモっておきましょう。
忘れた場合はこちらを参考にしてみてください。

#S3のバケットを作る#
 こちらを参考にバケットを作成してください。ここに画像ファイルが保存されていきます。
 その際に、ブロックパブリックアクセスをオフにしてください。

スクリーンショット 2021-10-10 11.53.22.png
これでAWSの設定は完了です!

#パッケージのインストール#
 最初に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ファイルを編集していきます。
このように書きます。

.env
AWS_ACCESS_KEY_ID=最初に生成されたアクセスキー
AWS_SECRET_ACCESS_KEY=最初に生成されたシークレットアクセスキー
AWS_DEFAULT_REGION=バケットのリージョン
AWS_BUCKET=バケット名
AWS_USE_PATH_STYLE_ENDPOINT=false

これで設定は完了です。

#コントローラーとビューの作成#
次に、コントローラーに画像をアップする処理、ビューに画像を表示する処理を書いていきます。

controller.php
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に保存された画像のパスが保存されます。

表示はこんな感じです。

index.blade.php
{{ Storage::disk('s3')->url("$item->img") }}
3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?