kem*_*kem 10 jsf monitor download primefaces
我想在执行zipManager.makeZip()时显示ajaxStatus ...直到下载开始.如果ajax = false,则文件下载有效,但不显示ajaxStatus.如果ajax = true,则显示ajaxStatus但下载不起作用!
知道如何让ajaxStatus和fileDownload一起工作.
提前致谢
KEM
<h:form id="form">
<p:commandLink id="download" value="Download"
onstart="showStatus()" oncomplete="hideStatus()"
actionListener="#{zipManager.makeZip()}">
<p:fileDownload value="#{zipManager.zip}"/>
</p:commandLink>
</h:form>
<p:ajaxStatus id="status" widgetVar="st" style="position:fixed;right:50%;bottom:50%">
<f:facet name="start">
<p:graphicImage value="images/wait.gif" />
</f:facet>
</p:ajaxStatus>
Run Code Online (Sandbox Code Playgroud)
Bal*_*usC 17
如果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>
Run Code Online (Sandbox Code Playgroud)
这可以通过更改命令链接在您的特定情况下应用,如下所示:
<p:commandLink id="download" value="Download" ajax="false"
onclick="PrimeFaces.monitorDownload(showStatus, hideStatus)"
actionListener="#{zipManager.makeZip()}">
Run Code Online (Sandbox Code Playgroud)
并在展示示例中演示<p:ajaxStatus>了简单替换<p:dialog>.
这一切都在幕后工作,有一个特殊的cookie,由JS(每100ms左右)以较短的间隔轮询.在创建文件下载响应期间,将在其标头上设置特殊cookie.一旦文件下载响应头到达浏览器,就会在浏览器中设置cookie.当JS轮询器在浏览器cookie空间中找到它时,它会关闭progess.