Escrevendo InputStream de um blob na OutputStream da Response

1 resposta
takeshi_spoow

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 :P

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.
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());
        }

    }

Obrigado!

1 Resposta

takeshi_spoow

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'"/>

Criado 19 de janeiro de 2011
Ultima resposta 26 de jan. de 2011
Respostas 1
Participantes 1