小编典典

ICEfaces库在类路径中可防止“另存为”对话框在文件下载时弹出

ajax

一旦将库icefaces.jar icepush.jar
icefaces_ace.jar添加到我的类路径中以使用ACE组件,我的“另存为”对话框将不会弹出?我不确定这是否是错误,但是在classpath中没有库就可以了。这是我的另存为方法:

    public void downloadFile(String propertyPath) throws IOException {

     ProxyFile fileToDownload = repBean.downloadFile(propertyPath);

     FacesContext facesContext = FacesContext.getCurrentInstance();
     ExternalContext externalContext = facesContext.getExternalContext();
     HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();

     response.reset();         response.setContentType(fileToDownload.getContentType()); 
     response.setHeader("Content-Length", String.valueOf(fileToDownload.getLength()));
     response.setHeader("Content-disposition", "attachment; filename=\"" + fileToDownload.getName() + "\"");

     BufferedInputStream input = null;
     BufferedOutputStream output = null;


     try {
         input = new BufferedInputStream(fileToDownload.getContent());
         output = new BufferedOutputStream(response.getOutputStream());

         byte[] buffer = new byte[10240];
         for (int length; (length = input.read(buffer)) > 0;) {
            output.write(buffer, 0, length);
         }
     } finally {
         output.close();
         input.close();
         facesContext.responseComplete(); 
        }
     }

阅读 238

收藏
2020-07-26

共1个答案

小编典典

您不能使用ajax下载文件。

Ajax在JavaScript
XMLHttpRequest对象执行的幕后。该请求将被成功执行,并且响应将被成功检索。但是,JavaScript无法将响应写到客户端的磁盘文件系统,也不能对给定的响应进行“
另存为” 对话框。那将是一个巨大的安全漏洞。

您的具体问题的原因是ICEfaces本身。即,当您将ICEfaces集成到JSF
Web应用程序中时,所有标准<h:commandXxx>链接/按钮都将默默地转换为启用了Ajax的链接/按钮,这确实在启动程序之间引起混淆。确保未使用ICEfaces引入的ajax工具隐式下载链接/按钮。按照他们在主题上的Wiki页面,您需要显式嵌套a
<f:ajax disabled="true">来禁用此功能。

禁用组件的Ajax

您还可以在单​​个组件级别禁用Ajax:

<h:commandButton value="Send" actionListener="#{bean.sendMessage}">
    <f:ajax disabled="true"/>
</h:commandButton>

将其应用于您的下载链接/按钮。

2020-07-26