Primefaces problem: p:filedownload from p:datatable with Vie



p:filedownload from p:datatable with ViewScoped managed bean不起作用。它两次调用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>

和管理bean(简化):

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:confirmDialog来解决这个问题,我提取了有问题的ajax=false命令链接,所以我通过在p:datatable中单击附件来选择附件,并从p:confirmDialog中执行下载。

我在2.2.1中遇到了同样的问题。我通过用相同的属性替换p:commandLinkp:commandButton找到了解决方案。似乎这是一个与commandLink组件的行为有关的bug

Ok,伙计们,所以我用一个简单的p:confirmDialog做了一个解决方案,在那里我提取了有问题的ajax=false命令链接,所以我通过在p:datatable中单击附件并从p:confirmDialog中执行下载。

我的解决方案是将"p:datatable"替换为"ui:repeat(facelets) and 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>

相关内容

  • 没有找到相关文章

最新更新