Forçar download de PDF - Problema

8 respostas
B

Boa noite, amigos.

Tenho uma página onde o usuário do site listará PDFs e o mesmo poderá “Visualizar” ou fazer o “Download”.
A visualização está ok, basta linkar como se fosse uma página normal …

Porém, para o download a coisa está feia.
Estou usando o seguint código.

<%
response.setContentType("application/pdf");
String arquivo=request.getParameter("arquivo");
response.addHeader("Content-Disposition", "attachment; filename=\""+arquivo+"\"");
ServletOutputStream outputStream = response.getOutputStream();
outputStream.flush();
outputStream.close();
%>

Até consigo baixar o arquivo, porém ao salvar o arquivo e abrí-lo, ele diz qu o arquivo tem 0kb, e aparece a seguinte mensagem “… não a suporte a esse tipo de arquivo, ou ele foi danificado …”

Como nada dava certo, apenas para testar, utilizei um servlet (" http://www.servletsuite.com/servlets/forcedownload.htm ") só para “ver tudo funcionando”, mas não funcionou. Acontece a mesma coisa. Aém do mais, não posso utilizar este saída, pois o usuário tem que ter a opção “Visualizar”. E no caso, mesmo que funcionasse, estaria forçando sempre o download dos PDFs.

Em relação ao código acima, já tentei também alterar “application/pdf” para “application/oct-stream” e acontece o mesmo problema.

Alguém pode dar uma ajuda?

Agradeço a todos.

8 Respostas

R

blnrj, entre as linhas 5 e 6 não está faltando vc escrever alguma coisa em outputStream?

M

O certo é “application/octet-stream”

abraços

B

mynameisflaw:
blnrj:

Em relação ao código acima, já tentei também alterar “application/pdf” para “application/oct-stream” e acontece o mesmo problema.

O certo é “application/octet-stream”

abraços

Obrigado pela resposta, mynameisflaw.

Fiz a mudança, e continuou o problema.

<%
response.setContentType("application/octet-stream");
String arquivo=request.getParameter("arquivo");
response.addHeader("Content-Disposition", "attachment; filename=\""+arquivo+"\"");
ServletOutputStream outputStream = response.getOutputStream();
outputStream.flush();
outputStream.close();
%>

O estranho é o arquivo ficar danificado. Eles não são gerados dinamicamente, se acesso a pasta “manualmente” eles abrem normalmente.

B

Oi, roassunca. Não consegui visualizar o que faltaria. Tem alguma idéia?

Abraço.

M

Tenta assim:

public void realizarDownloadDoArquivo(HttpServletResponse response, byte[] bytes, String nomeDoArquivo) {
		response.setContentType("application/octet-stream");
		response.setHeader("Content-Disposition", "attachment;filename=".append(nomeDoArquivo));
		response.setContentLength(bytes.length);
		ServletOutputStream ouputStream;
		try {
			ouputStream = response.getOutputStream();
			ouputStream.write(bytes, 0, bytes.length);
			ouputStream.flush();
			ouputStream.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
B

Mero_Aprendiz:
Tenta assim:

public void realizarDownloadDoArquivo(HttpServletResponse response, byte[] bytes, String nomeDoArquivo) { response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment;filename=".append(nomeDoArquivo)); response.setContentLength(bytes.length); ServletOutputStream ouputStream; try { ouputStream = response.getOutputStream(); ouputStream.write(bytes, 0, bytes.length); ouputStream.flush(); ouputStream.close(); } catch (IOException e) { e.printStackTrace(); } }

Obrigado, Mero_Aprendiz.

Mas preciso um pouco mais da sua ajuda. Como utilizar seu código? Eu sou apenas um assistente de aprendiz…

M

blnrj:

Obrigado, Mero_Aprendiz.

Mas preciso um pouco mais da sua ajuda. Como utilizar seu código? Eu sou apenas um assistente de aprendiz…

Olá blnrj…
Bem, não gosto de dar coisas muito mastigadas não, mas a ideia é a seguinte:

  • Ao invez de chamar um JSP para realizar o download, chame um servlet.
  • Pelo que eu vi o arquivo para download e o caminho físico dele no disco. Não faça assim. Ante de invocar o servlet, crie um File do arquivo que você quer realizar o download e o transforme em um array de bytes e o coloque no request.
  • No servlet, pegue o array de bytes e passe para o método que te passei.

Acretido que essa ideia simples pode te ajudar.

[]'s

JL

B

Boa tarde, Mero_Aprendiz.

Utilizei um servlet para o download, como sugeriu. Funcionou.
http://www.servletsuite.com/servlets/download.htm

Obrigado pela força.

Criado 25 de fevereiro de 2009
Ultima resposta 1 de mar. de 2009
Respostas 8
Participantes 4