通过 <p:commandButton ajax=“false”> 下载文件时如何使用 <p:blockUI>?

How to use <p:blockUI> while downloading a file via <p:commandButton ajax="false">?

提问人:Asyraf Dayan 提问时间:8/28/2023 最后编辑:BalusCAsyraf Dayan 更新时间:8/28/2023 访问量:35

问:

只是为了回答这个问题,我目前正在开发的应用程序正在使用 JSF2.0、PrimeFaces3.3 和 Liferay6.1.1。

文件下载的当前实现可以正常工作,尽管它同步运行并在浏览器中成功下载。下面是用于启动下载的 commandButton 和 managedBean 方法。

命令按钮

<p:commandButton value="#{lbl['lbl.btn.download']}"
    style="float:right;" ajax="false"
    action="#{backingBean.downloadZipFile}" />

托管Bean

    private void downloadZipFiles() throws IOException, FileNotFoundException{
        String sourceFile = "C:/Users/dev/Documents/test.txt";
        String zipFileName = "TestZip";
        
        PortletResponse portalresponse = (PortletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
        HttpServletResponse response = PortalUtil.getHttpServletResponse(portalresponse);       
        response.setContentType("application/zip");
        response.setHeader("Content-Encoding", "gzip");
        response.setHeader("Content-Disposition", "attachment; filename="
                + zipFileName + ".zip");
        
        try {

            ZipOutputStream zipOut = new ZipOutputStream(new BufferedOutputStream(
                    response.getOutputStream()));

            File fileToZip = new File(sourceFile);
            FileInputStream fis = new FileInputStream(fileToZip);
            ZipEntry zipEntry = new ZipEntry(fileToZip.getName());
            zipOut.putNextEntry(zipEntry);

            byte[] bytes = new byte[1024];
            int length;
            while((length = fis.read(bytes)) >= 0) {
                zipOut.write(bytes, 0, length);
            }

            zipOut.closeEntry();
            zipOut.close();
            fis.close();
            response.flushBuffer();
            FacesContext.getCurrentInstance().responseComplete();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

问题

我需要做的要求是在调用下载方法时添加一个 BlockUI。但从我所读到的内容来看,文件下载似乎不适用于 Ajax。

在 jsf 页面中使用 commandButton 下载文件

例如,加载程序在方法完成后显示并隐藏,并且在调试中运行代码时,它甚至通过而不会发生异常。问题是下载永远不会在浏览器中开始。当我将ajax设置为false时,它可以正常工作。

<p:blockUI block=":form" widgetVar="blockWidget">
        <h:graphicImage value="/css/images/ajax-loader.gif"></h:graphicImage>
</p:blockUI>
<p:commandButton value="#{lbl['lbl.btn.download']}"
        style="float:right;" ajax="true" onstart="blockWidget.show();" oncomplete="blockWidget.hide();"
        action="#{backingBean.downloadZipFile}" />

关于如何在构建 zip 时添加加载器的任何建议?

Ajax JSF 下载

评论

0赞 Jasper de Vries 8/28/2023
我建议升级到最新版本的 PrimeFaces(即 13,版本 3 是史前的)。从 PrimeFaces 10 开始,您可以简单地使用 Ajax 下载。
0赞 Asyraf Dayan 8/29/2023
@JasperdeVries确实如此,但当前的团队建议目前不要升级,以免破坏应用程序。我会记住这一点,谢谢
1赞 Jasper de Vries 8/29/2023
您的应用程序按原样“损坏”。这些版本之间有许多安全修复程序。升级总是最好的。只需确保遵循迁移指南即可。

答: 暂无答案