Проблема с Primefaces: p: загрузка файла из p: datatable с помощью управляемого компонента ViewScoped - PullRequest
5 голосов
/ 28 августа 2011

p: загрузка файла из p: datatable с управляемым компонентом ViewScoped не работает.Он вызывает методы prepareFile и getFile дважды.При первом вызове методов, о которых я упоминал, он устанавливает первый файл из таблицы, а при втором вызове методов он устанавливает правильный файл, но он всегда загружает только первый файл, а второй никогда не загружается.

Почему он звонит дважды?Почему он устанавливает первый файл из таблицы?Есть идеи?

Вот мой код:

<p:dataTable id="offer_attachment_datatable"
                     widgetVar="offer_attachment_datatable"
                     var="attachment"
                     value="#{offerBean.offerAttachments}">
            <p:column>
                <f:facet name="header"/>
                <p:commandLink ajax="false" actionListener="#{offerBean.prepareFile(attachment)}" title="#{attachment.name}">
                    <p:graphicImage value="/resources/themes/navigator_b2e/images/drive-download.png" />
                    <p:fileDownload value="#{offerBean.file}"/>
                </p:commandLink>
            </p:column>
</p:dataTable>

и в управляемом бине (упрощенно):

private StreamedContent file;
private InputStream stream;

public void prepareFile(OfferAttachment attachment){
    System.out.println("Attachment: "+attachment.getName());
    stream = new ByteArrayInputStream(attachment.getAttachment());
    file = new DefaultStreamedContent(stream, "text/plain", attachment.getName());
    stream = null;
}

public StreamedContent getFile() {
    System.out.println("File: "+file.getName());
    return file;
}

public void setFile(StreamedContent file) {
    this.file = file;
}

Итак, я сделал обходной путь с помощью простого p:verifyDialog, где я извлек проблемную ссылку команды ajax = false, поэтому я выбираю вложение, щелкая его в p: datatable, и выполняю загрузку из p: verifydialog.

Ответы [ 2 ]

1 голос
/ 26 марта 2012

У меня была такая же проблема в 2.2.1.Я нашел решение, заменив p:commandLink на p:commandButton с теми же атрибутами.Кажется, что это ошибка, связанная с поведением commandLink компонента

0 голосов
/ 30 января 2016

Решение, которое работало для меня, состояло в том, чтобы заменить «p: datatable» на «ui: repeat (facelets) и table», как это:

<table role="grid">
<thead>
    <tr role="row">
        <th>File Name</th>
        <th>Action</th>
    </tr>
</thead>
<tbody>
    <ui:repeat value="#{downloadFileBean.files}" var="f">
        <tr role="row">
            <td><h:outputText value="#{f.name}" /></td>
            <td>
                <p:commandLink id="download" ajax="false">
                    <h:outputText value="Download" />
                    <p:fileDownload value="#{downloadFileBean.file}" />
                    <f:param name="fileName" value="#{f.name}" />
                </p:commandLink>
            </td>
        </tr>
    </ui:repeat>
</tbody>

...