显示启动时的状态:文件下载并在完成后隐藏状态

时间:2012-11-06 16:06:05

标签: jsf primefaces download monitor

我想在执行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>

1 个答案:

答案 0 :(得分:17)

  

如果ajax = false,文件下载有效,但ajaxStatus未显示

那是因为下载不是由ajax请求发生的。


  

如果ajax = true,则显示ajaxStatus但下载不起作用!

这是因为下载不能通过ajax请求进行。 JS / Ajax将成功检索文件,但不知道如何处理它。没有办法强制与JS进行另存为对话。没有办法用JS访问本地磁盘文件系统(否则会出现巨大的安全漏洞)。


  

知道如何让ajaxStatus和fileDownload一起工作。

使用PrimeFaces提供的PrimeFaces.monitorDownload() JS函数。可以在their own <p:fileDownload> showcase page上找到一个完整的示例,下面将对其进行复制以供参考(特别注意文件下载命令按钮的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(每100ms左右)以较短的间隔轮询。在创建文件下载响应期间,将在其标头上设置特殊cookie。一旦文件下载响应头到达浏览器,就会在浏览器中设置cookie。当JS轮询器在浏览器cookie空间中找到它时,它会关闭progess。