Download de arquivo (OutputStream)

Galera estou com um problema com o uso de OutputStream. Programo em JSF, e estou gerando relatórios dinâmicos numa página JSP. Eu preciso salvar esse relatório em PDF, até aí td bem, eu estava salvando em disco, e depois puxando o link para o navegador. Não resolveu meu problema, pq não sei por qual motivo o relatório que era baixado era o penúltimo que havia sido gerado, e não o que eu tinha gerado na hora.

Dei uma pesquisada na net, e muitas pessoas me falaram pra criar o PDF na memória e fazer o download direto da memória. Eu tentei, mas não estou conseguindo. O meu código está ± assim:

this.memoryPDF = new ObjectOutputStream(new FileOutputStream("teste"));
JasperExportManager.exportReportToPdfStream(jasperPrint,this.memoryPDF);

aí eu crio o PDF na memória (não tenho certeza se estou fazendo da maneira certa)

e depois para efetuar o download não sei o que eu faço. será que é alguma coisa desse tipo???

response.setContentType("apllication/pdf");
response.sendRedirect(""+response.getOutputStream());

Desde já agradeço a ajuda de vocês, e peço que se alguém tiver algum exemplo parecido para postar.

obrigado.

algo próximo disso. Você deve colocar o pdf em memória no output do servlet. Primeiro eu faria um:

httpServletResponse.setContentType("application/pdf");
httpServletResponse.setHeader("Content-Disposition", "attachment; filename=\"SEU_ARQUIVO_SEI_LA.pdf\"");

porque ele nem sai da página que está solicitando o relatório (não substitui a mesma por um arquivo pdf.

Depois faria algo como:

ServletOutputStream outputStream = httpServletResponse.getOutputStream();
httpServletResponse.setContentLength(bytes.length);
outputStream.write(bytes, 0, bytes.length);
outputStream.flush();
outputStream.close();

Ou algo próximo a isso…

abraços,

otávio

Fala Otávio, então é o seguinte. Como eu mostrei no primeiro post, eu crio o pdf no OutputStream. O meu problema é que eu não sei como passar para o response.sendRedirect o endereço desse arquivo que foi criado na memória. eu já tentei de várias maneiras e sempre dá o mesmo erro:

HTTP Status 404 - meucaminha/org.ajax4jsf.webapp.FilterServletResponseWrapper$ByteArrayServletOutputStream@b368f

type Status report

message /meucaminha/org.ajax4jsf.webapp.FilterServletResponseWrapper$ByteArrayServletOutputStream@b368f

description The requested resource (/meucaminha/org.ajax4jsf.webapp.FilterServletResponseWrapper$ByteArrayServletOutputStream@b368f) is not available.
Apache Tomcat/5.5.17

Eu não tenho experiência com o uso de Servlets. Você pode me dar um exemplo bem simples de como faria isso ??

obrigado.

PS - Detalhe, a classe onde estou rodando esse script é um Bean, e não um servlet. Não sei se tem algum problema.

você não redireciona. você cospe ele pra tela. olha o exemplo que eu te dei.

alias no exemplo faltou uma coisa.

byte[] bytes = null;
bytes = JasperRunManager.runReportToPdf(relatorio, parametros, dataSource);

Ou seja, jogo o output pra um array de bytes, para depois mandar pra resposta do servlet