1

p:poll でファイルをダウンロードしようとしています。

これが私のコードです:

<p:commandButton id="sendMessage" value="sendMessage" actionListener="#{logsController.sendMessage}" />
<p:poll interval="3" async="false"  immediate="true" listener="#{logsController.downloadAll(null)}" />

およびバッキング Bean:

public void sendMessage( ActionEvent event ) {
   {adding message to queue}
}

public void downloadAll( ActionEvent event ) {
   ...
   if(readyToDownload) {
      Faces.sendFile(logFile.getFileByteArray(), "file.txt", true);
   }
}

「名前を付けて保存」ダイアログを開きたいのですが、JQuery json 解析エラーしか表示されません。

ダウンロードしようとしているコンテンツは外部APIからのメッセージ結果なので、いきなり取得できません。

たぶん、この問題を解決する別の方法はありますか?

4

1 に答える 1

4

いいえ。添付ファイル全体を ajax 応答として応答することはできません。まず第一に、jQuery は、HTML DOM ツリーをどう処理するかを指示する、予想される XML/JSON 応答の代わりに添付ファイルを受け取るため、混乱します。第 2 に、JavaScript には、明らかにセキュリティ上の理由から、任意の JavaScript 変数に保持されているファイル コンテンツを提供する [名前を付けて保存]ダイアログを強制する機能がありません。

ファイルのダウンロードは、同期リクエスト中に実際に行われる必要があります。<h:commandButton><p:commandButton ajax="false">、またはで起動された要求とまったく同じwindow.locationです。

最善の策は、同期リクエストを呼び出す JavaScript 命令を返すことです。例えば

if (readyToDownload) {
    RequestContext.getCurrentInstance().execute("document.getElementById('form:download').click();");
}
<h:form id="form">
    <p:commandButton id="download" styleClass="ui-helper-hidden"
        action="#{logsController.downloadFile}" ajax="false" />
</h:form>

そして、実際にdownloadFile()メソッドでファイルを送信します。

于 2015-06-10T09:51:55.407 に答える