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 14:44