Primefaces fileDownload - getOutputStream () уже был вызван для этого ответа - PullRequest
1 голос
/ 13 октября 2011

Я использую 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 ]

3 голосов
/ 13 октября 2011

Вы создаете поток в конструкторе компонента, а не в методе действия, связанном с <p:commandButton>. Симптомы указывают на то, что компонент помещается в более широкую область, чем область запроса. Конструктор вызывается только при построении компонента, а не при каждом HTTP-запросе. Если компонент помещается в область запроса, конструктор вызывается при каждом HTTP-запросе.

У вас есть 2 варианта:

  1. Поместите компонент в область запроса.

  2. Вместо этого создайте поток в методе действия и привяжите его к <p:commandButton action>.

0 голосов
/ 13 октября 2011

Есть ли на вашей странице несколько тегов <p:filedownload/> (возможно, с одинаковой привязкой)? У меня были проблемы с Primefaces при попытке использовать несколько тегов <p:filedownload/> с поддержкой ajax (связанных с различными свойствами в компоненте поддержки) на одной странице с другими функциями ajax-y. Казалось, главная проблема заключалась в том, что каждый <p:filedownload/> связывался с одним и тем же свойством. Требования моего проекта изменились таким образом, что избавили от необходимости загрузки ajax, поэтому у меня нет для вас хорошего решения, но это может помочь вам на вашем пути.

...