前提・実現したいこと
現在、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に対して、画像を保存しています
回答1件
あなたの回答
tips
プレビュー