1

我正在尝试通过 p:poll 下载文件。

这是我的代码:

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

和支持豆:

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 会感到困惑,因为它得到了一个文件附件,而不是预期的 XML/JSON 响应,其中包含如何处理 HTML DOM 树的说明。其次,出于明显的安全原因,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 回答