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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Laravel

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

Amazon S3

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

AWS(Amazon Web Services)

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

Q&A

解決済

1回答

1607閲覧

画像の保存先をpublicからS3に変更すると画像が表示されない

Atsushi_5858

総合スコア6

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Laravel

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

Amazon S3

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

AWS(Amazon Web Services)

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

0グッド

0クリップ

投稿2021/02/23 07:04

前提・実現したいこと

現在、laravel+dockerで商品を出品できるフリマアプリを制作しているのですが、商品画像の保存先をmysqlからS3に変更すると、画像が表示されなくなってしまいました。

発生している問題・エラーメッセージ

エラーメッセージ等はなく、S3には画像が保存されています。

バケット内の写真

しかし、対象の画像部分では保存した内容が表示されず、以下のように表示されています。
商品画像

該当のソースコード

sellControllerphp

1<?php 2 3namespace App\Http\Controllers; 4 5use App\Http\Requests\SellRequest; 6use App\Models\Item; 7use App\Models\ItemCondition; 8use App\Models\PrimaryCategory; 9use Illuminate\Http\File; 10use Illuminate\Http\Request; 11use Illuminate\Http\UploadedFile; 12use Illuminate\Support\Facades\Auth; 13use Illuminate\Support\Facades\Storage; 14use Intervention\Image\Facades\Image; 15 16class SellController extends Controller 17{ 18 public function showSellForm() 19 { 20 $categories = PrimaryCategory::query() 21 ->with([ 22 'secondaryCategories' => function ($query) { 23 $query->orderBy('sort_no'); 24 } 25 ]) 26 ->orderBy('sort_no') 27 ->get(); 28 29 $conditions = ItemCondition::orderBy('sort_no')->get(); 30 31 return view('sell') 32 ->with('categories', $categories) 33 ->with('conditions', $conditions); 34 } 35 36 public function sellItem(SellRequest $request) 37 { 38 $user = Auth::user(); 39 40 $imageName = $this->saveImage($request->file('item-image')); 41 42 $item = new Item(); 43 $item->image_file_name = $imageName; 44 $item->seller_id = $user->id; 45 $item->name = $request->input('name'); 46 $item->description = $request->input('description'); 47 $item->secondary_category_id = $request->input('category'); 48 $item->item_condition_id = $request->input('condition'); 49 $item->price = $request->input('price'); 50 $item->state = Item::STATE_SELLING; 51 $item->save(); 52 53 return redirect()->back() 54 ->with('status', '商品を出荷しました。'); 55 } 56 57 /** 58 * 商品画像をリサイズして保存します 59 * 60 * @param UploadedFile $file アップロードされた商品画像 61 * @return string ファイル名 62 */ 63 private function saveImage(UploadedFile $file): string 64 { 65 $tempPath = $this->makeTempPath(); 66 67 Image::make($file)->fit(300, 300)->save($tempPath); 68 69 $filePath = Storage::disk('s3') 70 ->putFile('item-images', new File($tempPath)); 71 72 return basename($filePath); 73 } 74 75 /** 76 * 一時的なファイルを生成してパスを返します。 77 * 78 * @return string ファイルパス 79 */ 80 private function makeTempPath(): string 81 { 82 $tmp_fp = tmpfile(); 83 $meta = stream_get_meta_data($tmp_fp); 84 return $meta["uri"]; 85 } 86}

sellbladephp

1 ###省略### 2 3 {{-- 商品画像 --}} 4 <div>商品画像</div> 5 <span class="item-image-form image-picker"> 6 <input type="file" name="item-image" class="d-none" accept="image/png,image/jpeg,image/gif" id="item-image" /> 7 <label for="item-image" class="d-inline-block" role="button"> 8 <img src="/images/item-image-default.png" style="object-fit: cover; width: 300px; height: 300px;"> 9 </label> 10 </span> 11 @error('item-image') 12 <div style="color: #E4342E;" role="alert"> 13 <strong>{{ $message }}</strong> 14 </div> 15 @enderror 16 17 ###省略### 18

itemsbladephp

1 2###商品の一覧画面です。ポストした画像を反映させています 3 4@foreach ($items as $item) 5 <div class="d-flex mt-5 border position-relative container-mk"> 6 <div class="position-relative overflow-hidden"> 7 <img class="img-fluid" style="height: 140px; width: 140px;" src="/storage/item-images/{{$item->image_file_name}}"> 8 <div class="position-absolute py-2 px-3" style="left: 0; bottom: 20px; color: white; background-color: rgba(0, 0, 0, 0.70)"> 9 <i class="fas fa-yen-sign"></i> 10 <span class="ml-1">{{number_format($item->price)}}</span> 11 </div> 12 <!--商品が購入済みの場合--> 13 @if ($item->isStateBought) 14 <div class="position-absolute py-1 font-weight-bold d-flex justify-content-center align-items-center" style="left: 0; top: 0; color: white; background-color: rgba(0, 0, 0, 0.70); width: 140px; height: 140px; font-size: 20px;"> 15 <span>完売</span> 16 </div> 17 @endif 18 </div> 19 <div class="flex-fill p-3"> 20 <small class="text-muted">{{$item->secondaryCategory->primaryCategory->name}} / {{$item->secondaryCategory->name}}</small> 21 <h5 class="card-title mt-2 font-weight-bold" style="font-size: 20px">{{$item->name}}</h5> 22 </div> 23 <a href="{{ route('item', [$item->id]) }}" class="stretched-link"></a> 24 </div> 25 @endforeach

試したこと

S3にて、保存することはできているので、画像の反映部分でもあるitems.blade.phpのimgのsrc属性に問題があると考えています。

類似の質問の以下の記事を参考に画像の呼び出し方を変更したのですが、解決することができませんでした。
参考にした質問(LaravelでS3に保存したが画像が表示されない)

データベースの設定を変更している記事もあったため、どのような手順が適しているのかお伺いしたく投稿させて頂きました。

お忙しい中恐縮ですが、ご教授いただければ幸いです。よろしくお願い致します。

開発環境

Laravel 7.25
PHP 7.3
S3に対して、画像を保存しています

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

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

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

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

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

hoshi-takanori

2021/02/23 08:03

img src にホスト名がないからでは。
Atsushi_5858

2021/02/23 08:13

hoshi-takanoriさん ご返信いただきありがとうございます。 ホスト名とは、権限を持ったIAMユーザーのことでしょうか?
hoshi-takanori

2021/02/23 10:15

S3 は詳しくありませんが、たぶん保存先は https://s3-ap-northeast-1.amazonaws.com/〜 みたいな URL になると思います。(ホスト名とはこの s3-ap-northeast-1.amazonaws.com とかのことです。) かつ、それはアプリが動いてるホスト (ネットワークに接続されたマシンのこと) とは別だと思いますが、<img src="/storage/〜"> という書き方だと同じホストに存在することになるために表示できないのでしょう。
Atsushi_5858

2021/02/23 12:11 編集

hoshi-takanoriさん ご返信いただきありがとうございます。 丁寧に説明をして頂き、大変感謝しております。 DBにpathのカラムを作成している記事を拝見したのですが、この場合はDBの編集は不要でしょうか? 現在の商品のデータテーブルは以下の通りです。 <creat_app_tables.php> Schema::create('items', function (Blueprint $table) { $table->id(); $table->unsignedBigInteger('seller_id'); $table->unsignedBigInteger('buyer_id')->nullable(); $table->unsignedBigInteger('secondary_category_id'); $table->unsignedBigInteger('item_condition_id'); $table->string('name'); $table->string('image_file_name'); $table->text('description'); $table->unsignedInteger('price'); $table->string('state'); $table->timestamp('bought_at')->nullable(); $table->timestamps(); $table->foreign('seller_id')->references('id')->on('users'); $table->foreign('buyer_id')->references('id')->on('users'); $table->foreign('secondary_category_id')->references('id')->on('secondary_categories'); $table->foreign('item_condition_id')->references('id')->on('item_conditions'); });
hoshi-takanori

2021/02/23 12:23

DB は関係ないと思いますけど…。S3 にアップロードした画像をブラウザで開くことが可能なら、その URL のファイル名の手前までの部分と $item->image_file_name を組み合わせれば良いのでは? (自分は S3 詳しくないので知りませんが、S3 の URL を取得する正しい方法は別にあるかもしれませんが…。)
Atsushi_5858

2021/02/23 12:32

hoshi-takanoriさん ご返信いただきありがとうございます。 頂いたアドバイスを参考に早速試してみます。 最後までご回答いただきありがとうございました。
guest

回答1

0

ベストアンサー

Storage::url() を使うとどうでしょうか。

items.blade.php

php

1<img src="{{ Storage::disk('s3')->url('item-images/' . $item->image_file_name) }}" ... >

参考: ファイルのURL

投稿2021/02/27 03:06

編集2021/02/27 04:01
Lulucom

総合スコア1899

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

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

Atsushi_5858

2021/03/01 03:57

Lulucomさん ご返信頂きありがとうございます。 アドバイス頂いたコードを実行してみると、無事、ブラウザ上での画像を確認することができました。誠にありがとうございます。以後、公式ドキュメントの読み込みも意識していきます。 今回もご教授いただき感謝しております。Lulucomさんの回答をもって、今回の質問を解決済みにしたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問