OutputStream na tela!

11 respostas
2

Galera, eu uso JSF, e preciso disponibilizar um relatório para download. Eu, seguindo algumas dicas até aqui do forum, criei o relatório na memória. Agora só tem um problema. Como eu faço aparecer a telinha de download???

o código do meu método é esse:

String caminho_arquivo = new File("").getAbsolutePath() + "/caminho";
			String nome_arquivo = "relatorio.jasper";
			JasperReport jasperReport = (JasperReport)JRLoader.loadObject(caminho_arquivo + nome_arquivo);
			Map parameters = new HashMap();
			parameters.put("Caminho", caminho_arquivo);
			//----------------------------------------------------------------------------------
			//this.bytes = JasperRunManager.runReportToPdf(jasperReport,parameters,this.getRelatorioBois());
			JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, this.getRelatorioBois());
			ByteArrayOutputStream pdfStream = new ByteArrayOutputStream();
			JasperExportManager.exportReportToPdfStream(jasperPrint, pdfStream);
			
			HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
			response.setContentType("application/pdf");    
			response.setHeader("Content-Disposition", "inline; filename=myPDF.pdf");
			response.setContentLength(pdfStream.size());
			try{
				ServletOutputStream sos = response.getOutputStream();    
				pdfStream.writeTo(sos);
				System.out.println("pdsStream - "+pdfStream); //->ele imprime o conteúdo do relatório, mas codificado pois é pdf.
				sos.flush();    
				sos.close();    
				pdfStream.close();   
				pdfStream = null;  
			}catch(IOException e){
				e.printStackTrace();
			}
			return "";
		
		}catch(JRException e){
			System.out.println("entrou no catch geraReportBois");
			
			e.printStackTrace();
		}
		return null;

Alguém pode me dar uma mãozinha??? Eu queria que no final desse método ele fizesse aparecer a tela de download para o cliente.

obrigado!

11 Respostas

nbluis

Só vai aparecer a tela de download se o browser não reconhecer o formato.

Se o cara tiver o reader instalado ele vai abrir no browser, com opção de o cara salvar.

OBS: Você pode zipar o conteudo ou mudar o formato, mas são opções não tão elegantes.

2

Então cara, mas não ta aparecendo nada! Isso que não consigo fazer. Poderia até abrir direto no navegador, mas quando eu clico no botão que chama o método ele vai até o SystemOut, imprime no console o relatório mas não aparece nada pro usuário.

Se aparecesse no navegador com opção de salvar já resolveria meu problema. Se sabe se eu esqueci de fazer alguma coisa???

nbluis

Ele chega a imprimir o System.out ?

Dá só o flush no ServletOutputStream, tira o close.

2

Luis, eu tentei o que você falou. Comentei o sos.close(), mas não acontece nada. Ele imprime o SystemOut sim… no console fica o relatório inteiro, codificado mas fica.

Se tem mais alguma idéia de como fazer aparecer na tela???

Se sabe se esse código precisa ficar em um servlet??? Porque o meu método ta dentro de um Bean na session.

nbluis

Bah, agora complicou. Não tenho mais idéias.

Nenhum código precisa ficar no servlet se não quizer.
Normalmente o pessoal coloca a escrita no servlet pelo acesso ao ServletOutputStream.

OBS: Se é apenas uma servlet pq você pega o response do faces ? [não conheco muito bem essa estrutura do faces]

2

É, na verdade eu não sei direito. Nunca tinha usado outputStream, agora to meio sem saber o que fazer, pq preciso fazer esse download…hehehe… Mas de qualquer maneira valeu pela ajuda.

nbluis

Se puder postar o restante da classe, talvez possa tentar ajudar.

Até.

2

Luis, na classe tem outros método que não tem relação nenhuma com a criação do relatório. é só aquele método mesmo.

Ele é chamado a partir de uma página JSP,assim:

<a4j:commandButton value="Exportar Relatório" action="#{geraRelatorios.geraReportBois}" />

Você tem algum exemplo de download que funciona??? vc usa JSF também???

D

Utilize response.setContentType(“application/octet-stream”);
Segundo a W3C ao usar este header em conjunto com o Content-Disposition, o browser deve dar ao usuário a opção de baixar o arquivo.
A informação foi tirada do link http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html item 19.5.1 Content-Disposition.

Abraço,

Diogo

nbluis

diogosantana:
Utilize response.setContentType(“application/octet-stream”);
Segundo a W3C ao usar este header em conjunto com o Content-Disposition, o browser deve dar ao usuário a opção de baixar o arquivo.
A informação foi tirada do link http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html item 19.5.1 Content-Disposition.

Abraço,

Diogo


Valeu pela dica diogo.

Quando eu tiver um tempinho eu vou testar isso.
Só espero que o pessoal da microsoft tenha considerado isso no IE. (ja que tantos outros eles não consideraram :twisted: ) .

:lol: :lol:

Até.

2

Galera, valeu pelas dicas, não consegui fazer funcionar ainda não, mas assim que funcionar eu posto aqui pra ficar como registro…

abraços…

Criado 3 de abril de 2008
Ultima resposta 4 de abr. de 2008
Respostas 11
Participantes 3