只要将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();
}
}
答案 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>
将其应用于您的下载链接/按钮。