Escrevendo InputStream de um blob na OutputStream da Response

Boa tarde. Estou desenvolvendo um sistema com Tomcat 5.0.29, JSF 2.0, PrimeFaces 2.2 e BD Oracle, e estou com uns problemas.

Tenho uma xtml onde eu exibo uma lista de documentos, quando o usuario dá duplo clique numa linha da tabela, um objeto é selecionado e obtido na managedbean, até ai tudo bem!

Com este objeto, eu executo um metodo que procura o documento no banco de dados, e retorna um arquivo do tipo blob referente ao documento (que pode ser um pdf, doc, xls, dwg, etc). No momento, só estou puxando documentos cujos os arquivos armazenados são do formato pdf, mas ja tenho um algoritmo pronto pra verificar o formato do arquivo para depois definir a ContentType da Response :stuck_out_tongue:

O problema é quando eu pego a InputSteam deste blob e tento escrever na OutputStream da response.

Gostaria de saber tambem se eu preciso mandar atualizar algum componente na View após o evento ajax de seleção. Sou newbie em JSF.

Segue o meu metodo.

[code]public void exportFile(Blob binario, String filename) throws IOException {
HttpServletResponse response = (HttpServletResponse)
FacesContext.getCurrentInstance().getExternalContext().getResponse();
ServletOutputStream outStream = response.getOutputStream();
int b = 0;
BufferedInputStream is = null;
byte[] buf = null;
try {
is = new BufferedInputStream(binario.getBinaryStream());

        response.setCharacterEncoding("ISO-8859-1");
        response.setContentType("application/pdf");
        response.setContentLength((int) binario.length());
        System.out.println(binario.length());
        response.addHeader("Content-Disposition", "inline; filename=\"" + filename + "\"");
        response.addHeader("Cache-Control", "no-cache");
        buf = new byte[8192];
        while ((b = is.read(buf, 0, buf.length)) != -1) {
            outStream.write(buf, 0, b);
        }
        is.close();
        System.out.println(response.getOutputStream());
        outStream.close();
        FacesContext.getCurrentInstance().responseComplete();
    } catch (Exception ex) {
        System.out.println(ex.getMessage());
    }

}[/code]

Obrigado!

pessoal, meu metodo está certo

o problema é que eu nao havia percebido que o meu botão deveria executar um “submit()” ao ser clicado, coisa que um commandButton do primefaces nao faz se o atributo “ajax” deste nao for setado como false.

pode-se também definir que o documento seja aberto em uma aba à parte.

<p:commandButton action="#{documentoManagedBean.abreDocumento}" value="Abrir Documento" ajax="false" onclick="form.target='_blank'"/>