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

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

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

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

PHP

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

Q&A

1回答

2297閲覧

【Laravel】画像を複数枚アップロードし、表示させたい

Keight

総合スコア9

Laravel

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

PHP

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

0グッド

0クリップ

投稿2020/06/18 04:44

Laravelで、画像の投稿機能を備えたサービスを開発中です。
画像を1枚だけの送信であれば、その1枚はビュー側で正常に表示されるんですが、画像を複数枚(上限10枚)送信したとき、ビュー側での表示のさせ方(書き方)がわかりません。
リクエストの中には複数枚入っているんですが、どのようにしたら複数枚表示されるようになりますか?

エラーがこのように出ています。
Cannot use [] for reading
イメージ説明


show.blade.php(フォームで入力した情報が表示されるページ

html

1 @if ($lecture->image) 2 <figure class="show_post_thumbnail"><div class="new_area-img text-center"><img class="show_image" src="{{ asset('storage/'.$lecture->image) }}"></div></figure> 3 @elseif ($lecture->image >= count(2) && $lecture->image < count(11)) 4 <figure class="show_post_thumbnail"><div class="new_area-img text-center"><img class="show_image" src="{{ asset('storage/'.$lecture->image[]) }}"></div></figure> 5 @else 6 <figure class="show_post_thumbnail"><div class="new_area-img text-center"><img src="../img/noimage.gif"></div></figure> 7 @endif

ちなみに、コントローラーで、
受け取った image$files として代入し、それの一つ一つにパスを割り当てた後にセーブしているので、画像を複数枚送信したとしても、最終的には1つしか画像が残らないというような記述になっているのかもしれないのですが、やはり書き方がおかしいでしょうか?

LecturesController

PHP

1public function store(Request $request) { 2 3 $this->validate($request, [ 4 'category_name' => 'required', 5 'title' => 'required|max:100', 6 'content' => 'required', 7 ]); 8 9 if ($request->hasFile('image') ) { 10 $lecture = new Lecture; 11 12 $lecture->user_id = \Auth::id(); 13 $lecture->category_name = $request->category_name; 14 $lecture->title = $request->title; 15 $lecture->content = $request->content; 16 17 $files = $request->file('image'); 18 19 // foreach で $files に入った画像を $file として別個に取り出す 20 foreach ($files as $file) { 21 22 // UNIXタイムスタンプを取得したものと、ユーザーID、オリジナルの拡張子を取得したものとを繋ぎ、ファイル名として $filename に代入 23 $filename = time() . '_' . $lecture->user_id . '.' . $file->getClientOriginalExtension(); 24 25 // storeAs の第1引数は storage からのパス、第2引数はファイル名、第3引数は利用するストレージ(local、public…など) 26 $path = $file->storeAs('', $filename, ['disk' => 'public']); 27 28 // パスを image カラムに代入 29 $lecture->image = $path; 30 31 // 最終的な状態を保存 32 $lecture->save(); 33 } 34 } 35 else { 36 $request->user()->lectures()->create([ 37 'category_name' => $request->category_name, 38 'title' => $request->title, 39 'content' => $request->content, 40 ]); 41 } 42 43 return redirect('/'); 44 }

create.blade.php(フォーム)

html

1<div class="form-group"> 2 <label class="font-weight-bold">画像</label> 3 <input type="file" name="image[]" class="form-control-file" multiple="multiple"> 4</div> 5<div class="form-group"> 6 <label class="font-weight-bold">画像</label> 7 <input type="file" name="image[]" class="form-control-file" multiple="multiple"> 8</div> 9<div class="form-group"> 10 <label class="font-weight-bold">画像</label> 11 <input type="file" name="image[]" class="form-control-file" multiple="multiple"> 12</div> 13<div class="form-group"> 14 <label class="font-weight-bold">画像</label> 15 <input type="file" name="image[]" class="form-control-file" multiple="multiple"> 16</div> 17<div class="form-group"> 18 <label class="font-weight-bold">画像</label> 19 <input type="file" name="image[]" class="form-control-file" multiple="multiple"> 20</div> 21<div class="form-group"> 22 <label class="font-weight-bold">画像</label> 23 <input type="file" name="image[]" class="form-control-file" multiple="multiple"> 24</div> 25<div class="form-group"> 26 <label class="font-weight-bold">画像</label> 27 <input type="file" name="image[]" class="form-control-file" multiple="multiple"> 28</div> 29<div class="form-group"> 30 <label class="font-weight-bold">画像</label> 31 <input type="file" name="image[]" class="form-control-file" multiple="multiple"> 32</div> 33<div class="form-group"> 34 <label class="font-weight-bold">画像</label> 35 <input type="file" name="image[]" class="form-control-file" multiple="multiple"> 36</div> 37<div class="form-group"> 38 <label class="font-weight-bold">画像</label> 39 <input type="file" name="image[]" class="form-control-file" multiple="multiple"> 40</div>

以上、詳しい方よろしくお願いいたしますm(_ _)m

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

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

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

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

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

guest

回答1

0

foreachで必要なだけimgタグを生成してください

投稿2020/06/18 05:37

mikkame

総合スコア5036

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

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

Keight

2020/06/18 05:45 編集

それはどこに記述すればいいでしょうか? show.blade.phpで、このようにしてみましたが、「Undefined variable: files」と出ました???? @if ($lecture->image)  @foreach ($files as $file)  <figure class="show_post_thumbnail"><div class="new_area-img text-center"><img class="show_image" src="{{ asset('storage/'.$lecture->image) }}"></div></figure>  @endforeach  @else  <figure class="show_post_thumbnail"><div class="new_area-img text-center"><img src="../img/noimage.gif"></div></figure> @endif
mikkame

2020/06/18 06:02

filesという変数が存在しません。 という意味です。$filesっていきなりでてきていますがどこからでてきましたか?
Keight

2020/06/18 06:07

LecturesControllerのほうで書いているのですが、それをビュー側で使うには何かやり方があるのでしょうか? public function store(Request $request) { $this->validate($request, [ 'category_name' => 'required', 'title' => 'required|max:100', 'content' => 'required', ]); if ($request->hasFile('image') ) { $lecture = new Lecture; $lecture->user_id = \Auth::id(); $lecture->category_name = $request->category_name; $lecture->title = $request->title; $lecture->content = $request->content; $files = $request->file('image'); // foreach で $files に入った画像を $file として別個に取り出す foreach ($files as $file) { // UNIXタイムスタンプを取得したものと、ユーザーID、オリジナルの拡張子を取得したものとを繋ぎ、ファイル名として $filename に代入 $filename = time() . '_' . $lecture->user_id . '.' . $file->getClientOriginalExtension(); // storeAs の第1引数は storage からのパス、第2引数はファイル名、第3引数は利用するストレージ(local、public…など) $path = $file->storeAs('', $filename, ['disk' => 'public']); // パスを image カラムに代入 $lecture->image = $path; // 最終的な状態を保存 $lecture->save(); } } else { $request->user()->lectures()->create([ 'category_name' => $request->category_name, 'title' => $request->title, 'content' => $request->content, ]); } return redirect('/'); }
mikkame

2020/06/18 06:13

redirectと書いてありますね。この時点で別のHTTPリクエストになるので変数の持ち越しはできません。 View云々、画像云々ではありません。 画像は関係ないので、文字列であればビューに渡す事ができるかどうか周りから考えてみてはどうでしょうか
Keight

2020/06/18 06:29

そうなんですね、勉強になりますm(_ _)m 「文字列であればビューに渡す事ができるかどうか」ということについて、恥ずかしながら、どういうことなのかが理解できるレベルではなく、手詰まりを感じています。 コントローラーでの複数画像の取り扱い(書き方)に問題は見られませんでしょうか? また、画像が複数送信された際に、ビューに表示させる場合は、ビュー側でどのように書くとよいでしょうか? すみません、解から検証してできたらと考えております。 いろいろと調べてみたのですが、ちょっともう八方塞がりな状態で????
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問