10

zipManager.makeZip() の実行中に ajaxStatus を表示したい...ダウンロードが始まるまで。ajax=false の場合、ファイルのダウンロードは機能しますが、ajaxStatus は表示されません。ajax=true の場合、ajaxStatus は表示されますが、ダウンロードが機能しません。

ajaxStatus と fileDownload を連携させる方法についてのアイデア。

前もって感謝します

ケム

<h:form id="form">
    <p:commandLink id="download" value="Download"
        onstart="showStatus()" oncomplete="hideStatus()" 
        actionListener="#{zipManager.makeZip()}">
        <p:fileDownload value="#{zipManager.zip}"/>  
    </p:commandLink>
</h:form>

<p:ajaxStatus id="status" widgetVar="st" style="position:fixed;right:50%;bottom:50%">  
    <f:facet name="start">  
        <p:graphicImage value="images/wait.gif" />  
    </f:facet>  
</p:ajaxStatus>
4

1 に答える 1

20

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 スペースでそれを見つけると、進行状況を閉じます。

于 2012-11-06T16:23:46.987 に答える