ajax=false の場合、ファイルのダウンロードは機能しますが、ajaxStatus は表示されません
これは、ダウンロードが ajax リクエストによって行われないためです。
ajax=true の場合、ajaxStatus は表示されますが、ダウンロードが機能しません。
これは、ajax リクエストではダウンロードを実行できないためです。JS/Ajax はファイルを正常に取得しますが、その処理方法がわかりません。JS で [名前を付けて保存]ダイアログを強制する方法はありません。JS を使用してローカル ディスク ファイル システムにアクセスする方法はありません (それがなければ、大きなセキュリティ違反になっていたでしょう)。
ajaxStatus と fileDownload を連携させる方法についてのアイデア。
PrimeFaces が提供するPrimeFaces.monitorDownload()
JS 関数を使用します。完全な例は、参照用に以下にコピーペーストされている独自の<p:fileDownload>
ショーケース ページonclick
にあります (特に、ファイル ダウンロード コマンド ボタンの属性に注意してください)。
<p:dialog modal="true" widgetVar="statusDialog" header="Status"
draggable="false" closable="false" resizable="false">
<p:graphicImage value="/design/ajaxloadingbar.gif" />
</p:dialog>
<h:form id="form">
<p:commandButton id="downloadLink" value="Download" ajax="false"
onclick="PrimeFaces.monitorDownload(start, stop)"
icon="ui-icon-arrowthichk-s">
<p:fileDownload value="#{fileDownloadController.file}" />
</p:commandButton>
</h:form>
<script type="text/javascript">
function start() {
statusDialog.show();
}
function stop() {
statusDialog.hide();
}
</script>
これは、コマンド リンクを次のように変更することで、特定のケースに適用できます。
<p:commandLink id="download" value="Download" ajax="false"
onclick="PrimeFaces.monitorDownload(showStatus, hideStatus)"
actionListener="#{zipManager.makeZip()}">
ショーケースの例で示されているよう<p:ajaxStatus>
に、単純なものに置き換えます。<p:dialog>
これはすべて、JS によって短い間隔 (約 100 ミリ秒ごと) でポーリングされる特別な Cookie を使用して、舞台裏で機能します。ファイル ダウンロード応答の作成中に、そのヘッダーに特別な Cookie が設定されます。ファイル ダウンロードの応答ヘッダーがブラウザーに到着すると、Cookie がブラウザーに設定されます。JS ポーラーがブラウザーの Cookie スペースでそれを見つけると、進行状況を閉じます。