LoginSignup
21
14

More than 3 years have passed since last update.

「Herokuにデプロイしたページの画像が表示されない!?」を解決する AWS S3 超カンタン利用法

Last updated at Posted at 2019-09-06

どうも、Hiroyukiです!

本日は、別の記事でも少し触れた、

Herokuで画像を表示させるための「AWS S3」超カンタン利用法!

を解説しようと思います^^

s3.PNG

「画像が表示されない!?」問題発生

自分のオリジナルサービスが完成!!
「よーし、あとはHerokuにデプロイするだけだから、余裕やな〜〜」

と思ってたのも束の間、

「Heroku上に、、、ガガガ、、画像が表示されませーーーん。。。。

 オワタ・・・(涙目)」

となったので、ググりますと何と、

「Herokuに画像をアップしても、一定時間で消去される」

 という仕様なのだぁああーーーーと判明(絶望・・・!)

まあ、落ち込んでてもしゃーないので、対策方法をググって見つけたのが「AWS S3」。

ググってたら結構難しめな記述でS3と連携させてる記事も多かったので、

(初心者向けに)超簡単なS3利用方法を解説しませう!

AWS S3 でバケットを作成

まず、S3とは、アマゾンが提供するストレージ機能です。

要するに、「画像とか貯めとけますよ〜」っていうサービス。

手順としては、以下の通り。

1.AWSアカウント作成

カンタンにできますので、下記をご覧ください〜
https://aws.amazon.com/jp/register-flow/

登録時に下記のキーが作られるので

 ・Access key ID

 ・Secret access key

これをメモしておいて下さいね〜!

2.S3バケット作成

AWSアカウントでログイン後、S3のバケットを作ります。
詳しくは下記URLへ。

要約しますと

・任意のバケット名を決める

・リージョン(地域)を選ぶ

・プロパティを設定する(基本初期設定のままで問題ないかと)

この3点を設定するだけで、S3の設定が完了しちゃいますっ!

AWS SDK for PHPをインストール

次は、AWS SDK for PHPを composer でインストールしていきます!

$ composer install aws/aws-sdk-php

Herokuの環境変数を設定

Herokuの環境変数を下記の様に設定します!

heroku config:set AWS_ACCESS_KEY_ID='AWSで作成したAccess key ID'
heroku config:set AWS_SECRET_ACCESS_KEY='AWSで作成したSecret access key'
heroku config:set AWS_DEFAULT_REGION='作成したバケットのリージョン名'
heroku config:set AWS_BUCKET_BUCKET='作成したバケット名'

画像アップロード機能を実装

さて、いよいよアップロード処理をいじっていきます。
でも、下記の様に書けば、めちゃくちゃカンタンなはず!

今回は

「アイコン画像を登録して、表示させるまでのやり方」

でつくってみました~

コントローラー:S3 に保存させる処理

PhotosController.php

class PhotosController extends Controller
{
    public function storeIcon(Request $request)
    {
            $file=$params['photo'];

            // s3のuploadsファイルに追加
            $path = Storage::disk('s3')->put('/icon_images',$file, 'public');

            // パスを、ユーザのicon_image_urlというカラムに保存
            $user=\Auth::user();
            $user->icon_image_url = $path;
            $user->save();

            return view('setting.channel');
    }

ミソは、

1. S3 の icon_images というフォルダに画像を保存!

(フォルダに入れても、S3上に裸のファイルを入れてもいいでしょう)

2. S3 のパスを$pathという変数に代入

3. その$pathをユーザの icon_image_url というカラムに保存

という流れです!

ブレイド:アイコン画像をPOSTして、表示させるまでの処理

channel.blade.php

<h2>アイコン画像を変更</h2>

<span width="100px" height="100px">
   <img class="rounded" src="{{ Storage::disk('s3')->url(Auth::user()->icon_image_url) }}">
</span>

<figcaption>現在のアイコン画像</figcaption>

<form method="POST" action="/storeIcon" enctype="multipart/form-data">
 {{ csrf_field() }}
  <input type="file" name="photo">
  <input type="submit" value="更新する?" class="button btn">
</form>

ここでは、S3 のパスをimgのsrcに入れ込みます!

ルーター:ルーティング処理

web.php

Route::post('storeIcon','PhotosController@storeIcon')->name('icon.store');

以上!

結構簡単じゃないですか?

まあ、僕もこういうところでつまづいて止まってたんですけどね。。。(汗)

補足: S3 アクセス権限について

ちなみに補足ですが、
上記コードのアップロード機能を経由した画像等は、画像のパスによって
(普通は問題なく)画像にアクセスが可能だと思うのですが、

自分で「AWS S3のコンソール画面」からに画像等をアップロードした場合

→アクセス権限が許可されておらず、画像が表示されない!!

という問題が起こる時があります(実体験!)

ボクもこれに悩みまくった。。。。

同じことでお悩みの方がいましたら、
下記の通りやっていただくと、画像が正常に表示されますので、要チェック!

1.各画像の詳細画面から、「アクセス権限」のタブを押す

→ パブリックアクセス に行く

publicaccess.PNG

2.(↑コチラ)Everyone をクリック!

yomitori.PNG

3.オブジェクトの読み取り にチェックを入れる!

こういう流れです。

流れを整理すると簡単に見えるんですが、細かいところでつまづいちゃいますよね~。

仕方ない、人間だもの。。。。

あと、上記コードを使って S3 アップロードしている

ボクのオリジナルサービス ←クリック

も気になる方は参考までに、チェックしてみてくださいね~~!

ではまた!Hiroyukiでした!!^^

21
14
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
21
14