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

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

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

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

2回答

8704閲覧

Laravelでバリデーションエラー時にアップロードした画像を表示する方法

miguchi73

総合スコア15

PHP

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

3クリップ

投稿2018/10/04 09:51

前提・実現したいこと

Laravelで入力項目が名前と画像の2つのみのフォームを作っています。
どちらも必須項目です。
名前は未入力で画像のみ選択して送信した場合、エラーとなり入力画面に戻りますが、その際にアップロードした画像を入力画面上に表示したいと考えております。

試したこと

素のPHPの場合は入力画面に戻る際に画像の情報を変数にセットして表示する処理を入れますが、Laravelの場合、バリデーション発生時にold('photo',$photo)のように初期値をセットしてやれば出来るのかなと思いましたが、それだと駄目でした。

Laravelでこういった処理を実現する事は可能なのでしょうか?
可能だとしたらどのように書けばいいかご教示いただけませんでしょうか。
Laravelのバージョンは5.7です。
よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

laravelで、ファイルを含む送信フォームでバリデーションエラーがあった場合。。。
リダイレクトされて、入力画面に戻るので、アップロードした筈のファイルはいなくなっちゃいますよね。

これは、かなり困った事件です。
私も正しい解決方法はいまだ分からず・・・画期的な方法があるなら教えて欲しいくらい・・^^;

ということで、下記は私がよくやる、妥協策です。


■ jsで読み込んで文字列に

※ アップロードファイルが大きくない(制限をかける)& 画像限定 ならば有かな、という方法です。

jsでアップロードしたファイルを読み込んで、画像データを文字列として input type="hidden"に入れて送信します。

受取側では送信された実際のfileは無視しちゃいます。
input="hidden"に値をいれて送信するので、通常のinput=textと同じように、バリデーションエラーで戻った場合にもoldで値が取得できます。

この方法だと、選択したファイルを即時に見られるようにもできるので、対ユーザーのUI的にもいいかなと思ってもみたり・・・


■ 事前にバリデーションチェック

バリデーション結果だけを返却するAPIを用意するか、
ajaxでのアクセス時にはバリデーション結果だけを返却できるように、POST先の処理を変更します。

画面遷移を行うform送信では、バリデーションエラーにはならないように、
formをsubmit前に、上記へ一度ajaxでformを送信してチェックを行います。

戻ってきた結果に問題が無ければ、実際にformをsubmitし、もしエラーがあれば、帰ってきた結果をエラーとして画面内に表示します。

ajax通信かつエラーの場合、laravelがjsonでうまいことエラーメッセージを返してくれるのでけっこう使いやすいです。


あと、下記は、上の2つに比べると手間がかかるので私はあまりやらないのですが。

■バリデーション処理前に、ファイルがあればアップロードの処理を行う

FormRequestを使っているなら、そちらで、
Contoller側で自前でバリデーションをかけているなら、バリデーション処理前に。

エラーで戻ってもファイルが確保できるように、アップロードのファイルがあれば一時フォルダなりにファイルをstoreする処理まで行ってから、バリデーション処理を通します。

エラーで戻る場合に渡されるデータに、移動させたアップロードファイル名が含まれるようにするのを忘れないよう、ご注意ください。。。

投稿2018/10/10 09:06

mix-peach

総合スコア1910

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

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

miguchi73

2018/10/10 14:44

色々な代替案ありがとうございます。 私も先にアップロードするのとかは想定してましたが、画像をhiddenに入れるやり方とかは知らなかったので勉強になりました。 とりあえず普通に画像表示するのは無理そうですね。。 セッションに突っ込んでみたり、ミドルウェア使ってみたり色々試してみましたが結局すべてダメでした。
guest

0

https://readouble.com/laravel/5.7/ja/requests.html

のリファレンス、「アップロードファイルの取得」が参考になりますよ。

投稿2018/10/04 10:54

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

miguchi73

2018/10/06 10:15

ご回答ありがとうございます。 アップロードファイルを取得して画面に表示するために公開領域に移動するところとかはできているのですが、バリデーションでエラーになって入力画面に戻ったときにその画像を表示する方法がわかりません。
退会済みユーザー

退会済みユーザー

2018/10/06 10:33

そもそも、input type~"file" には初期値を設定することができません。セキュリティの問題でこのAPI自体が存在していません。
miguchi73

2018/10/06 11:17

すみません。なんか実装の仕方が私の場合独特な気がしてきました。(^^; input type="file" に値を戻すのではなくて、私の場合、バリデーションエラーになったとしても画像のアップロードが成功している場合は画像は入力画面に表示してやるという仕様にしています。 なのでたとえばinput type="file" name="photo"でアップロードして成功したらのすぐ上あたりにimgタグで成功した画像を表示するというようにしているのですが、laravelだとバリデーションエラーになると変数に画像ファイルのパスをセットしてimgタグに渡してやってもうまくいかないので、どうしたらいいかわからなくなってます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.40%

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

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

質問する

関連した質問