Download de PDF com servlet (simples mas nem tanto)

3 respostas
R

Eu criei uma servlet genérica aqui que serve para baixar uma série de conteúdos gerados dinamicamente pela minha aplicação.

Copiei o trecho mais importante aqui

if (conteudo instanceof byte[]) {
			response.getOutputStream().write((byte[])conteudo);
			response.getOutputStream().flush();
			response.getOutputStream().close();
		} if (conteudo instanceof InputStream) {
			IOUtils.copy((InputStream)conteudo, response.getOutputStream());
			IOUtils.closeQuietly((InputStream)conteudo);
		} else {
			PrintWriter out = new PrintWriter(response.getOutputStream());
			out.print(conteudo);
			out.flush();
			out.close();
		}

No caso, as vezes tenho um relatório em PDF que vem como um byte[], porém ao começar a baixar pelo navegador, percebi que o navegador baixa tudo primeiro, para depois exibir. Mas já percebi que ao navegar por ai, o plugin do adobe reader, já exibe enquanto vai baixando o PDF, sempre acreditei que minha servlet funcionasse dessa forma.

Então vem a pergunta: Isso é alguma configuração do Adobe? ou a maneira como escrevo o byte[] no response? Se eu escrever byte a byte, isso aconteceria?

OBS: ATENÇÃO ESSA SERVLET FUNCIONA EM PRODUÇÃO A DOIS ANOS.

3 Respostas

davidbuzatto

Como está o seu response?

gui_sv
response.setContentType("application/pdf");

// opção para salvar no disco 
response.setHeader("Content-disposition", "attachment; filename=\"arquivo.pdf\"");

espero ter ajudado

R

response.setContentType(“application/pdf”);

Lembrando que ele abre dentro do browser
não é esse o problema

O problema é que ele tem que baixar inteiro com a janela aberta pra exibir, tem um relatório de 50Mb que já poderia estar exibindo as primeiras páginas enquanto vai baixando o resto, mas não está fazendo isso

estou achando que é porque estou copiando o array de bytes direto pro outputstream
eu mexi na rotina para que ele utilize diretamente o outputStream do response na geração do relatório, mas ainda não tive a oportunidade de testar.

Criado 22 de outubro de 2008
Ultima resposta 22 de out. de 2008
Respostas 3
Participantes 3