如果 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>
如展示示例中所示。
这一切都在后台使用特殊的 cookie 进行,JS 会在短时间内(每 100 毫秒左右)轮询一次。在创建文件下载响应期间,将在其标题上设置一个特殊的 cookie。一旦文件下载响应标头到达浏览器,就会在浏览器中设置 cookie。当 JS 轮询器在浏览器 cookie 空间中找到它时,它会关闭进程。