■やりたいこと
画面のボタンを押すと、ダウンロードが始まる処理があります。
コントローラのアクションで下記コードのようにレスポンス
return response()->download($pathToFile, $name);
と、ここまでは公式サイトを見れば簡単にできました。
ダウンロードするファイルを生成して
そのファイルをレスポンスし終わるまで10秒ほどかかるため
待たせる間、ローディング画面を表示することにしました。
■やってみたこと
ローディング画面は、表示中の画面の上にかぶせるように表示させるものと、
ローディング画面を消すものをJavaScript(jQuery使用)関数で作成しました。
・show_loading()でローディング画面表示
・hide_loading()でローディング画面消す
ダウンロードを開始する画面ボタンを押すと、show_loading()を実行するようにして
ローディング画面の表示は簡単にできました。
<input type="button" onClick="show_loading();download();" value="download">
ただ、表示させたローディング画面を消す処理をどう書けばいいかが分かりません。
■分からないこと
表示させたローディング画面を消す処理をどう書くか?
ダウンロードの完了を検知する必要がありますが、
調べてもイベント発火するみたいなことはなさそうです。
代替策としてCookieを使ってサーバ側からダウンロードの終わりを知らせる情報がありました。
ダウンロードをレスポンスする際に、第3引数でCookieは渡せるのですが
return response()->download($pathToFile, $name, $headers);
これだとダウンロード開始タイミングでCookieを渡すため、完了を検知することはできません。
Laravelだとこういう場合、Middlewareを使ってダウンロードの最後にCookieを仕込むことができそうな
気がしていますが、どう実装していいか分かりません。