可以在 p:poll 上下载文件
It is possible to download file on p:poll
我正在尝试通过 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);
}
}
我希望打开 "save as" 对话框,但我只收到 JQuery json 解析错误。
我正在尝试下载的内容是来自外部api的消息结果,所以我突然无法获取。
也许有另一种方法可以解决这个问题?
没有。您不能将整个文件附件作为 ajax 响应进行响应。首先,jQuery 会感到困惑,因为它得到的是一个文件附件,而不是预期的 XML/JSON 响应,其中包含如何处理 HTML DOM 树的说明。其次,出于明显的安全原因,JavaScript 没有任何工具可以强制 另存为 对话提供保存在任意 JavaScript 变量中的文件内容。
文件下载必须在同步请求期间真正发生。正是使用 <h:commandButton>
、<p:commandButton ajax="false">
或 window.location
.
触发的请求
您最好的选择是 return 一条 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()
方法中实际发送文件。
我正在尝试通过 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);
}
}
我希望打开 "save as" 对话框,但我只收到 JQuery json 解析错误。
我正在尝试下载的内容是来自外部api的消息结果,所以我突然无法获取。
也许有另一种方法可以解决这个问题?
没有。您不能将整个文件附件作为 ajax 响应进行响应。首先,jQuery 会感到困惑,因为它得到的是一个文件附件,而不是预期的 XML/JSON 响应,其中包含如何处理 HTML DOM 树的说明。其次,出于明显的安全原因,JavaScript 没有任何工具可以强制 另存为 对话提供保存在任意 JavaScript 变量中的文件内容。
文件下载必须在同步请求期间真正发生。正是使用 <h:commandButton>
、<p:commandButton ajax="false">
或 window.location
.
您最好的选择是 return 一条 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()
方法中实际发送文件。