当我点击h:commandButton
时,它会执行myBean.dowanlod()
方法,但它不会下载任何文件。
这是我在backing bean中的方法。没有例外。光标变得忙碌,似乎在等待响应。是否有此类操作的其他配置或此代码是否有任何错误?
<h:commandButton value="download" action="#{myBean.download()}" />
@ManagedBean
@SessionScoped
public class MyBean implements Serializable{
//....
public String download{
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
String fileName = "test.txt";
String filePath = "D:\\test.txt"; //externalContext.getRealPath("") + File.separator + fileName;
File file = new File(filePath);
externalContext.setResponseHeader("Content-Type", "text/plain");
externalContext.setResponseHeader("Content-Length", String.valueOf(file.length()));
externalContext.setResponseHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\"");
InputStream input = null;
OutputStream output = null;
try {
input = new FileInputStream(file);
output = externalContext.getResponseOutputStream();
IOUtils.copy(input, output);
} catch (FileNotFoundException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
} finally {
IOUtils.closeQuietly(output);
IOUtils.closeQuietly(input);
}
facesContext.responseComplete();
return null;
}
//...
}
答案 0 :(得分:2)
ICEfaces有一个奇怪的“feature”,它隐式地将所有标准JSF <h:commandButton>
转换为启用了ajax的命令按钮。但是,使用ajax下载文件是不可能的。您需要明确地将其关闭。您可以通过嵌套<f:ajax disabled="true">
来按每个按钮执行此操作。
<h:commandButton value="download" action="#{myBean.download()}" />
<f:ajax disabled="true"/>
</h:commandButton>
答案 1 :(得分:0)
之前我有<h:head>
和<ice:form>
。此文件下载事件不适用于这些命名空间。只需使用<head>
和<h:form>
即可解决问题。我正在学习JSF,所以我对此一无所知。不知怎的,它对我有用。
我从BalusC's blog找到了更好的文件下载教程。如果有人知道或可以猜出原因,请提出一些想法。