初学者です。Laravel(6.20.16) uiを使って、ユーザーからinputで取得した画像を投稿する機能を実装しようと考えています。取得した画像はRequestでバリデーションした後、ControllerでDBに保存され、bladeで表示されるようにする流れを考えています。
投稿画面__create.blade.php__
Blade
1<div class="col-md-6 mb-4"> 2<form method="POST" enctype="multipart/form-data"action="{{ route('articles.store') }}"> 3 @csrf 4 <div class="file-field"> 5 <div class="d-flex justify-content-center"> 6 <div class="btn btn-mdb-color aqua-gradient btn-rounded float-left"> 7 <span>アルバムから選択</span> 8 <input type="file" name="image">//画像取得 9 </div> 10 </div> 11 </div> 12 </div> 13<button type="submit" class="btn btn-block">投稿する</button> 14</form>
取得した画像を__LetterRequest__でバリデーション
php
1<?php 2 3namespace App\Http\Requests; 4 5use Illuminate\Foundation\Http\FormRequest; 6 7class LetterRequest extends FormRequest 8{ 9 //略 10 public function authorize() 11 { 12 return true; 13 } 14 15 /** 16 * Get the validation rules that apply to the request. 17 * 18 * @return array 19 */ 20 public function rules() 21 { 22 return [ 23 'image' => 'file|image|max:10000|present|nullable|sometimes', 24 ]; 25 } 26 27//以下略 28
バリデーションした画像を、__LetterController__でDBに格納。
まずpublicディレクトリに保存し、それからDBに入れるような流れです。
(画像はファイル名とパスを取得して保存するようにしました。)
php
1if(isset($request->image)) //画像が存在したら 2 { 3 $request->image = $request->file('image')->store('public/images'); 4 $request->image = str_replace('public/images/', '', $image);//publicディレクトリに格納 5 $letter->file_name= $request->image->getClientOriginalName();//ファイル名と 6 $letter->file_path = $request->image->getRealPath();//パスを取得し、DBに保存 7 then(move($request->file_path,'public/images')); 8 } 9 else{ 10 } ; 11 $letter->save(); 12 return redirect()->route('articles.index'); 13//以下略
そして、DBからデータを取り出して表示します
Blade
1<div class="container"> 2@foreach ($letters as $letter) 3 <div class="card"> 4 <div class="bg-image hover-overlay ripple" data-mdb-ripple-color="light"> 5 <img 6 class="img-fluid" src='{{$letter->file_path}})' 7 /> 8 </div> 9//以下省略
しかし、い表示してみると、画像はうまく表示されず、表示されなかったとき用のいつものテンプレマークが表示されるだけです。DBをみると、投稿画面から取得した画像のファイル名、パス共に正しく格納されていました。
また、実装途中でシンボリックリンクを行うことでpublicにstorageファイルが生成され、画像がそこに保存されると知ったので、CLIでphp artisan storage:linkを行いました。しかし、エディタ上にはstorageファイルは見当たりません。エクスプローラーで確認するとstorageファイルがpublicディレクトリの中に生成されていたので、直接エディタの中にコピペしようと思いましたが、エラーが表示されコピペできませんでした。
Error: EACCES: permission denied, stat Cドライブ~
ググってみると認証を緩和することが必要と書かれていたので、CLIで
__ chmod -R 777 storage__
を叩きましたが、効果なしでした。
どこかのコードを誤って記述している可能性が高いのかなと思うのですが、私のバカ頭ではどうしようもできませんでした。どなたかご教授頂けると幸いです。よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。