可以在p:poll上下载文件

时间:2015-06-10 09:24:49

标签: jsf jsf-2 primefaces download ajax-polling

我试图通过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);
   }
}

我希望打开&#34;另存为&#34;对话框,但我只得到JQuery json解析错误。

我尝试下载的内容是来自外部API的消息结果,所以我无法突然得到这个内容。

也许是解决这个问题的另一种方法?

1 个答案:

答案 0 :(得分:4)

不。您不能将整个文件附件作为ajax响应进行响应。首先,jQuery会感到困惑,因为它有一个文件附件而不是预期的XML / JSON响应以及如何处理HTML DOM树的说明。其次,出于明显的安全原因,JavaScript没有任何设施强制另存为对话框提供任意JavaScript变量中保存的文件内容。

在同步请求期间确实要进行文件下载。完全是<h:commandButton><p:commandButton ajax="false">window.location触发的请求。

最好的办法是返回一条JavaScript指令来调用同步请求。 E.g。

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()方法发送文件。