1

ファイルをダウンロードできるデータテーブルがあります。できます。ただし、返されたフィルタリング後にファイルをダウンロードしようとすると、リストの最初に表示されます。

この画像は、teste4.txt をクリックすると、同じファイルがダウンロードされたことを示しています。正解です。正しいダウンロード

この別の図は、ファイル teste4.txt をクリックしてフィルタリングした後、ダウンロードされたファイルが teste1.txt であることを示しています。間違ったダウンロード

これは、データテーブルを含む私のファイルです:

<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 のヘルパー メソッドです。

private void pushArquivo(ExternalContext externalContext, String nomeArquivo, String nomeDeExibicao) throws IOException {

    // Info sobre a lógica usada: http://stackoverflow.com/questions/1686821/execute-backing-bean-action-on-load
    File descritoArquivo = new File(nomeArquivo);
    int length = 0;
    OutputStream os = externalContext.getResponseOutputStream();
    String extencaoArquivo = externalContext.getMimeType(nomeArquivo);
    externalContext.setResponseContentType((extencaoArquivo != null) ? extencaoArquivo : "application/octet-stream");
    externalContext.setResponseContentLength((int) descritoArquivo.length());
    externalContext.setResponseHeader("Content-Disposition", "attachment; filename=\"" + nomeDeExibicao + "\"");

    // Stream to the requester.
    byte[] bbuf = new byte[1024];
    DataInputStream in = new DataInputStream(new FileInputStream(descritoArquivo));
    while ((in != null) && ((length = in.read(bbuf)) != -1)) {
        os.write(bbuf, 0, length);
    }

    in.close();

}

4

1 に答える 1

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();
}
于 2013-04-06T14:16:43.140 に答える