如何在Primefaces的过滤数据表中下载文件?

时间:2013-04-03 18:03:20

标签: java jsf primefaces

我有一个允许您下载文件的数据表。有用。但是,当我尝试下载一个文件后,返回的过滤首先在列表中。

此图显示,当点击teste4.txt时,下载了相同的文件。这是对的。 Correct download

这张照片显示,点击文件teste4.txt后,过滤后,下载的文件为teste1.txt Download wrong

这是我的包含数据表的文件:

<h:form id="hFormListaArquivosRegiao2" enctype="multipart/form-data">

    <p:dataTable id="pDataTableListaArquivos" var="arquivo" value="#{arquivoBean.listaArquivos}" filteredValue="#{arquivoBean.filteredListaArquivos}">

        <p:column id="pColumnNomeArquivo" headerText="#{msg.NomeDoArquivo}" sortBy="#{arquivo.nomeArquivo}" filterMatchMode="contains" filterBy="#{arquivo.nomeArquivo}">

            <h:commandLink action="#{arquivoBean.download}" title="#{arquivo.nomeArquivo}">

                <h:outputText value="#{arquivo.nomeArquivo}" />
                <f:setPropertyActionListener target="#{arquivoBean.arquivo}" value="#{arquivo}" />

            </h:commandLink>

        </p:column>

</h:form>

<h:form id="hFormListaArquivosRegiao2" enctype="multipart/form-data"> <p:dataTable id="pDataTableListaArquivos" var="arquivo" value="#{arquivoBean.listaArquivos}" filteredValue="#{arquivoBean.filteredListaArquivos}"> <p:column id="pColumnNomeArquivo" headerText="#{msg.NomeDoArquivo}" sortBy="#{arquivo.nomeArquivo}" filterMatchMode="contains" filterBy="#{arquivo.nomeArquivo}"> <h:commandLink action="#{arquivoBean.download}" title="#{arquivo.nomeArquivo}"> <h:outputText value="#{arquivo.nomeArquivo}" /> <f:setPropertyActionListener target="#{arquivoBean.arquivo}" value="#{arquivo}" /> </h:commandLink> </p:column> </h:form>

这是backingBean负责下载的方法:

public void download() throws Exception {

    logger.debug("NOME ARQUIVO: "+ ContextoBean.CAMINHO_ARQUIVOS + arquivo.getNomeArquivo() +", "+ arquivo.getNomeArquivo());

    FacesContext facesContext = FacesContext.getCurrentInstance();
    pushArquivo(facesContext.getExternalContext(), ContextoBean.CAMINHO_ARQUIVOS + arquivo.getNomeArquivo(), arquivo.getNomeArquivo());
    facesContext.responseComplete();

}

这是backingBean的辅助方法,负责下载: public void download() throws Exception { logger.debug("NOME ARQUIVO: "+ ContextoBean.CAMINHO_ARQUIVOS + arquivo.getNomeArquivo() +", "+ arquivo.getNomeArquivo()); FacesContext facesContext = FacesContext.getCurrentInstance(); pushArquivo(facesContext.getExternalContext(), ContextoBean.CAMINHO_ARQUIVOS + arquivo.getNomeArquivo(), arquivo.getNomeArquivo()); facesContext.responseComplete(); }

1 个答案:

答案 0 :(得分:0)

如果我是你,我会做一些改变,通过方法参数得到当前的arquivo:

<h:commandLink action="#{arquivoBean.download(arquivo)}">
    <h:outputText value="#{arquivo.nomeArquivo}" />
</h:commandLink>

在豆子里:

public void download(Arquivo arquivo) throws Exception {
    FacesContext facesContext = FacesContext.getCurrentInstance();
    pushArquivo(facesContext.getExternalContext(),
        ContextoBean.CAMINHO_ARQUIVOS + arquivo.getNomeArquivo(),
        arquivo.getNomeArquivo());
    facesContext.responseComplete();
}