私は同じ問題を抱えていて、2 つのステップで解決策を選択しました。
これは、ダウンロードを開始する準備が整うまでファイルを準備している間、spinner.gif および/または待機メッセージを表示および非表示にするための優れたソリューションだと思います。
?cmd=prepare
最初に、jQuery を使用してアンカーを変更し、uri にajax を追加してダウンロード関数を呼び出します。これにより、サーバー側で PDF が準備され、クライアントが到達可能なフォルダー (domain.ext/documents/my_pdf_name.pdf など) に保存されます。
HTML (ブートストラップ 3) :
<a href="/search/download" class="btn btn-primary pull-left download">
<i class="fa fa-file-pdf-o"></i> Download result in PDF
</a>
jQuery :
$(function() {
$('.download').on('click', function(e) {
e.preventDefault();
$('.loading').show();
url = $('.download').attr('href') + '?cmd=prepare';
$.ajax({
url: url,
type: 'get',
success: function(filename) {
console.log(data);
window.location = filename;
$('.loading').hide();
}
});
});
});
PHP サーバー側:
// ajax call
if(addslashes($_GET["cmd"]) == "prepare") {
echo create_pdf($_SESSION["search"], $out="prepare");
die();
}
- ファイルの準備ができると、関数
create_pdf()
はファイル名をクライアントに返し、ajax クエリの成功関数でwindow.location = filename
、「ウィンドウとして保存」を表示する a を呼び出します。
サーバーサイドでのドキュメント作成はajaxで呼び出しますが、ダウンロードはそうではありません!
- このソリューションの結果として生じる問題は、サーバーに保持したくないファイルのストレージです。そのため、bash スクリプトを使用して x 時間より古いファイルを削除できます。たとえば、https://stackoverflow.com/a/249591/2282880