我正在使用Primefaces fileDownload。当我第一次启动应用程序时,文件被下载,但每次按下载按钮时,都会出现此错误:
java.lang.IllegalStateException: getOutputStream() has already been called for this response
我的xhtml代码:
<p:commandButton value="Download" ajax="true">
<p:fileDownload value="#{fileDownloadController.file}" />
</p:commandButton>
我的java代码:
private StreamedContent file;
public FileDownloadController() {
InputStream stream = null;
try {
stream = FacesContext.getCurrentInstance().getExternalContext().getResourceAsStream("/Enastr1.txt");
file = new DefaultStreamedContent(stream, "txt", "Downloaded_Enastr1");
} catch (Exception ex) {
Logger.getLogger(FileDownloadController.class.getName()).log(Level.SEVERE, null, ex);
} finally {
}
}
public StreamedContent getFile() {
return file;
}
public void setFile(StreamedContent file) {
this.file = file;
}
答案 0 :(得分:3)
您正在bean的构造函数中创建流,而不是在与<p:commandButton>
关联的操作方法中创建流。症状表明bean放在比请求范围更广的范围内。构造函数仅在bean的构造时调用,而不是在每个HTTP请求上调用。如果将bean放在请求范围中,则在每个HTTP请求上调用构造函数。
您有两个选择:
将bean放在请求范围内。
改为在操作方法中创建流,并将其绑定到<p:commandButton action>
。
答案 1 :(得分:0)
页面中是否有多个<p:filedownload/>
标记(可能具有相同的绑定)?尝试在具有其他ajax-y功能的同一页面中使用多个启用了ajax的<p:filedownload/>
标记(绑定到支持bean中的不同属性)时,我遇到了Primefaces的问题。主要问题似乎是每个<p:filedownload/>
都绑定到同一个属性。我的项目要求发生了变化,不再需要ajax下载,所以我没有一个很好的解决方案,但这可能对你有所帮助。