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

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

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

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

PHP

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

Q&A

解決済

2回答

1395閲覧

Laravel 6.*でimageが表示できない

ttori_san

総合スコア7

Laravel

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

PHP

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

0グッド

0クリップ

投稿2021/03/05 05:48

初学者です。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__
を叩きましたが、効果なしでした。

どこかのコードを誤って記述している可能性が高いのかなと思うのですが、私のバカ頭ではどうしようもできませんでした。どなたかご教授頂けると幸いです。よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ご回答ありがとうございます!
どうやらDocker周りとの連携ミスのようです…提示していただいたコード、熟読させていただきます。
詳細なご教授ありがとうございます。

投稿2021/03/21 02:43

ttori_san

総合スコア7

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

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

0

ベストアンサー

アクションで、アップロードされたファイルの処理が少しおかしい気がしています。
以下のような感じにするのは不都合がありますか?

php

1if(isset($request->image)) //画像が存在したら 2{ 3 // アップロードファイルを storage/app/public/images/ ディレクトリへ保存 4 $path = $request->file('image')->store('public/images'); 5 6 // ファイルの元の名前と保存先のパスを Letter へセット 7 $letter->file_name= $request->file('image')->getClientOriginalName(); 8 $letter->file_path = $path; 9} 10 11// 中略 12 13$letter->save(); // Letter を保存

参考: ファイルアップロード

Letterモデルでは、ファイルURLを取得できるようなアクセサを定義しておくと良いと思います。

php

1use Illuminate\Support\Facades\Storage; 2 3// 中略 4 5 /** 6 * ファイルURLを取得 7 * 8 * @return string 9 */ 10 public function getFileUrlAttribute() 11 { 12 return Storage::url($this->file_path); 13 }

参考:

Bladeで以下のように記述すると、上記のアクセサが呼び出され、ファイルURLを取得できます。

php

1<img class="img-fluid" src="{{ $letter->file_url }}">

投稿2021/03/07 02:07

Lulucom

総合スコア1899

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問