类路径中的ICEfaces库阻止“另存为”对话框弹出文件下载

时间:2012-11-16 16:53:23

标签: ajax jsf jsf-2 download icefaces

只要将librarys icefaces.jar icepush.jar icefaces_ace.jar添加到我的类路径中以便使用ACE组件,我的SaveAs对话框就不会弹出?我不确定这是否是一个错误,但没有类路径中的库,它可以工作。这是我的保存方法:

    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(); 
        }
     }

1 个答案:

答案 0 :(得分:2)

您无法使用ajax下载文件。

Ajax是由JavaScript的XMLHttpRequest对象执行的。请求将成功执行,并且将成功检索响应。但是,JavaScript无法将响应写入客户端的磁盘文件系统,也无法使用给定的响应强制执行另存为对话。这将是一个巨大的安全漏洞。

具体问题的原因是ICEfaces本身。也就是说,当您将ICEfaces集成到JSF Web应用程序中时,所有标准<h:commandXxx>链接/按钮将无声地转换为启用了Ajax的链接/按钮,这确实会引起启动者之间的混淆。确保下载链接/按钮不是隐式使用ICEfaces引入的ajax工具。根据{{​​3}},您需要显式嵌套<f:ajax disabled="true">以禁用此功能。

  

禁用组件的Ajax

     

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

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

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