質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Amazon S3

Amazon S3 (Simple Storage Service)とはアマゾン・ウェブ・サービスが提供するオンラインストレージサービスです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

1回答

7147閲覧

AWS S3にアップロードした画像を表示したい

takamori

総合スコア7

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Amazon S3

Amazon S3 (Simple Storage Service)とはアマゾン・ウェブ・サービスが提供するオンラインストレージサービスです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2020/04/08 16:41

編集2020/04/09 08:17

動画投稿機能をつけた簡易的なSNSサイトを作成中です。
先日herokuで公開したのですが、投稿画像やプロフィール画像を表示することができなかったため、
Amazon S3にて画像を管理しようと考えました。
Amazon S3に画像をアップロードするところまでは行きましたがその後viewでの表示がうまく行きません。
画像を表示するにはどのようにすればいいでしょうか?
コントローラー

PostController

1コード 2public function store(Request $request) 3 { 4 //バリデーション 5 $validator = Validator::make($request->all() , ['caption' => 'required|max:255', ]); 6 7 //エラーの場合 8 if ($validator->fails()) 9 { 10 return redirect()->back()->withErrors($validator->errors())->withInput(); 11 } 12 13 // Postモデル作成 14 $post = new Post; 15 $post->caption = $request->caption; 16 $post->user_id = Auth::user()->id; 17 18 $post->save(); 19 20 if($request->photo == null){ 21 return redirect('/'); 22 } 23 24 25 //$request->photo->storeAs('public/post_images', $post->id . '.jpg'); 26 $request->photo->storeAs('public/post_images', $post->id . '.jpg', ['disk' => 's3']); 27 28 29 return redirect('/'); 30 }

view

PHP

1 <div class="card"> 2 <div class="card-header align-items-center d-flex"> 3 <a class="no-text-decoration" href="/users/{{ $post->user->id }}"> 4 @if ($post->user->profile_photo) 5 <img class="post-profile-icon round-img" src="{{ asset('storage/user_images/' . $post->user->profile_photo) }}"/> 6 @else 7 <img class="post-profile-icon round-img" src="{{ asset('/images/blank_profile.png') }}"/> 8 @endif 9 </a> 10 <a class="black-color no-text-decoration" title="{{ $post->user->name }}" href="/users/{{ $post->user->id }}"> 11 <strong>{{ $post->user->name }}</strong> 12 </a> 13 @if ($post->user->id == Auth::user()->id) 14 <a class="ml-auto mx-0 my-auto" rel="nofollow" href="/postsdelete/{{ $post->id }}"> 15 <div class="delete-post-icon"> 16 </div> 17 </a> 18 @endif 19 </div> 20 <span style=" margin-left: 10px; margin-top: 10px; margin-right: 10px; margin-bottom: 5px;">{{ $post->caption }}</span> 21 //画像表示 22 <a href="/users/{{ $post->user->id }}"> 23 <img src="/storage/post_images/{{ $post->id }}.jpg" class="card-img-top" alt="" /> 24 </a>

posttable

1public function up() 2 { 3 Schema::create('posts', function (Blueprint $table) { 4 $table->increments('id'); 5 $table->string('caption'); 6 $table->integer('user_id'); 7 $table->timestamps(); 8 }); 9 } 10

イメージ説明

どうかご教授いただければと思います。よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Lulucom

2020/04/09 08:04

Amazon S3 コンソールでそのバケットの中を確認するとpublic/post_images/の中に該当ファイルは存在していますか?
takamori

2020/04/09 08:19

返信ありがとうございます! もう一度post_imagesの中をみましたが保存はされているようでした。 post_imagesの中の画像を追加しました
Lulucom

2020/04/09 08:21

public/post_images ではなく post_images ということでしょうか?
takamori

2020/04/09 08:23

回答ありがとうございます すみません、public/post_imagesで間違い無いです
guest

回答1

0

ベストアンサー

バケット内の public/post_images/ に保存されているのでしたら、以下のように URL を取得できないでしょうか。

php

1 <img src="{{ Storage::disk('s3')->url("public/post_images/{$post->id}.jpg") }}" class="card-img-top" alt="" />

(追記)ファイルのURLへのアクセスが拒否される場合は、ファイル視認性を設定する。

PostController@store

php

1$request->photo->storeAs('public/post_images', $post->id . '.jpg', ['disk' => 's3', 'visibility' => 'public']); 2// あるいは 3$request->photo->storePubliclyAs('public/post_images', $post->id . '.jpg', ['disk' => 's3']);

投稿2020/04/09 04:25

編集2020/04/10 04:36
Lulucom

総合スコア1899

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takamori

2020/04/09 07:08

回答ありがとうございます 教えていただいたコードと入れ替えてみたのですが、 syntax error, unexpected '}', expecting ',' or ')' 上記のエラーが出てしまいました。どのように直せば良いでしょうか?
Lulucom

2020/04/09 07:26

ごめんなさい修正しました。
takamori

2020/04/09 07:55

回答ありがとうございます syntax errorはなくなりましたが画像は表示されないままでした
Lulucom

2020/04/09 08:48

表示されない画像のURLをHTMLソースで確認できると思います。 Amazon S3 コンソールで確認できる該当ファイルのオブジェクトURLと比べると違っていますか?
Lulucom

2020/04/09 12:28 編集

それは質問に添付された画面(Amazon S3 コンソール)のURLのようですね。それではなく、その画面に表示されている該当ファイル名をクリックすると、該当ファイルの詳細ページを見れると思います。その詳細ページで表示されている「オブジェクトURL」のことです。 また、画像が表示されないページのHTMLソースを見ることはできますか?問題となっているimgタグのsrc属性はどのようなURLになっているでしょうか。 これらのURLが一致していれば画像は表示されると思うのですが...。
takamori

2020/04/09 12:57

返信ありがとうございます https://バケット名.s3-ap-northeast-1.amazonaws.com/public/post_images/3.jpg このようになっていました。 一致しているように見えます
Lulucom

2020/04/09 12:59

そのURLにブラウザからアクセスすると画像は表示されますか?
takamori

2020/04/09 16:22 編集

返信ありがとうございます アクセスしようとすると以下のエラーが出ました <Error> <Code>AccessDenied</Code> <Message>Access Denied</Message> <RequestId>E4A2AA86155D7D45</RequestId> <HostId> mt8OPc5UYJB0a6pReIvoAFbmvhvyoRVYS5IUhoWNhQ/X2P4WZybMrUC9vR7JArq/p8GgPm9o66M= </HostId> </Error> バケットやアカウントのアクセスブロック設定は全てオフにしています
Lulucom

2020/04/09 22:02 編集

PostController@storeの中でファイルを保存する部分を以下のようにするとどうでしょうか。 $request->photo->storeAs('public/post_images', $post->id . '.jpg', ['disk' => 's3', 'visibility' => 'public']); あるいは、 $request->photo->storePubliclyAs('public/post_images', $post->id . '.jpg', ['disk' => 's3']); 新たに保存されたファイルは見れるようになるでしょうか。
takamori

2020/04/10 04:25

返信ありがとうございます 教えていただいた通りに@storeのファイルを保存する記述を変更したら画像を表示できるようになりました! visibility' => 'public'の記述はどのユーザーからもアクセス可能にするという意味でしょうか?
takamori

2020/04/11 03:51

すごく助かりました! 最後まで丁寧に教えていただきありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問