Проблема JSF PrimeFaces FileDownload - PullRequest
1 голос
/ 01 июня 2011

Я использую PrimeFaces для нового проекта, и это довольно впечатляющий набор компонентов.Во всяком случае, у меня есть проблема с использованием "реального мира" компонента загрузки файла.На моей странице есть список данных, который показывает вложения, связанные с конкретным документом, и я хочу предоставить ссылку для прямой загрузки этого файла в элемент списка данных.Вот мой код xhtml:

<p:dataList id="ListaAllegati" value="#{documentBean.documento.allegati}" type="definition" var="attach" style="border: none" ">            
   <f:facet name="description">
      <h:outputText value="#{attach.name}" />                  
      <p:commandLink ajax="false" title="Download" action="#{documentBean.selectAttach}>  
         <h:graphicImage style="margin-left: 10px; border: none" value="./images/article.png" height="24" width="24" ></h:graphicImage>
         <p:fileDownload value="#{documentBean.downloadFile}"/>
         <f:setPropertyActionListener target="#{documentBean.selectedAttach}" value="#{attach}" />
      </p:commandLink>
   </f:facet>
</p:dataList>

и относительный Java-бин (объем запроса):

private StreamedContent downloadFile;

public StreamedContent getDownloadFile() {      
    log.info("getter dell'allegato invocato");
    InputStream stream = null;
    byte[] rawFile = null;
    if (selectedAttach == null) {
        log.warn("Nessun allegato passato");
        return null;
    } else {
        try {
            log.info("Recupero del file " + selectedAttach.getGuid());
            rawFile = attachManager.retrieveFile(selectedAttach.getGuid());
        } catch (Exception e) {
            String msg = "Errore durante il recupero del file";
            log.error(msg, e);
            FacesMessage fmsg = new FacesMessage(msg, "");
            FacesContext.getCurrentInstance().addMessage(null, fmsg);
        }
        stream = new ByteArrayInputStream(rawFile);
        DefaultStreamedContent file = new DefaultStreamedContent(stream,
                selectedAttach.getMimeType(), selectedAttach.getName());
        return file;
    }
}

public void selectAttach() {
    log.info("commandLink action invocata");        
}

private Allegato selectedAttach;

public Allegato getSelectedAttach() {
   return selectedAttach;
}

public void setSelectedAttach(Allegato selectedAttach) {
   log.info("Allegato selezionato");
   if (selectedAttach==null) log.warn("L'allegato passato è nullo");
   this.selectedAttach = selectedAttach;
}

Итак, пара вопросов:

  1. Яделать правильные вещи, пытаясь передать выбранное вложение таким образом?В противном случае, как я могу передать параметр, чтобы сообщить о бине, по которому щелкнуло вложение?
  2. Почему в первый раз, когда я щелкаю ссылку команды, ничего не происходит?Это сделать туда-обратно с сервером, но ничего не происходит.Во второй раз это дает мне исключение.
  3. Почему никогда не вызывается documentBean.selectAttach, а свойство documentBean.selectedAttach никогда не устанавливается (ни во второй раз)?за любую подсказку

Ответы [ 2 ]

2 голосов
/ 01 июня 2011

Как получить объект строки из таблицы данных, ответ на этот вопрос:

Это отвечает в основном на все три вопроса.

Что касается исключения во втором щелчке, то это скорее всего потому, что вы не вернулись из блока catch, когда в вашем методе getDownloadFile() возникло исключение. Вы продолжаете остаток потока кода, пока rawFile все еще null. Исправьте это соответственно. Добавьте return null в конец catch или что-то еще. А еще лучше, вы должны опубликовать всю трассировку стека в вопросе, так как вы, похоже, не в состоянии ее понять. Это в основном уже содержит ответ:)

0 голосов
/ 01 июня 2011

Primefaces имеет свой собственный выделенный сервлет для загрузки файлов и компонентов загрузки, которые обрабатывают все это асинхронно.

Попробуйте сделать что-то наподобие того, что есть в моем коде

<p:commandLink ajax="false" actionListener="#{managedBean.downloadAction(object)}">
  <span class="ui-icon icoFolderGo" style="padding-right: 1.5em;" />
  <p:fileDownload value="#{managedBean.downloadContentProperty}" />
</p:commandLink>

А в управляемом бобе

public void downloadAction(Object object) {
  try {
    InputStream stream = // get input stream from argument  
    this.setDownloadContentProperty(new DefaultStreamedContent(stream, "application/pdf", "filename.pdf");
  } catch (Exception e) {
    log.error(e);
  }
}

public void setDownloadContentProperty(StreamedContent downloadContentProperty) {
  this.downloadContentProperty = downloadContentProperty;
}

public StreamedContent getDownloadContentProperty() {
  return downloadContentProperty;
}
...