Primefaces fileDownload - 已为此响应调用了getOutputStream()

时间:2011-10-13 14:14:31

标签: java jsf-2 primefaces

我正在使用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;
        }

2 个答案:

答案 0 :(得分:3)

您正在bean的构造函数中创建流,而不是在与<p:commandButton>关联的操作方法中创建流。症状表明bean放在比请求范围更广的范围内。构造函数仅在bean的构造时调用,而不是在每个HTTP请求上调用。如果将bean放在请求范围中,则在每个HTTP请求上调用构造函数。

您有两个选择:

  1. 将bean放在请求范围内。

  2. 改为在操作方法中创建流,并将其绑定到<p:commandButton action>

答案 1 :(得分:0)

页面中是否有多个<p:filedownload/>标记(可能具有相同的绑定)?尝试在具有其他ajax-y功能的同一页面中使用多个启用了ajax的<p:filedownload/>标记(绑定到支持bean中的不同属性)时,我遇到了Primefaces的问题。主要问题似乎是每个<p:filedownload/>都绑定到同一个属性。我的项目要求发生了变化,不再需要ajax下载,所以我没有一个很好的解决方案,但这可能对你有所帮助。