Forçar download de PDF - Problema

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.

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

O certo é “application/octet-stream”

abraços

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

O certo é “application/octet-stream”

abraços[/quote]

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.

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

Abraço.

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

[quote=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(); } } [/quote]

Obrigado, Mero_Aprendiz.

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

[quote=blnrj]

Obrigado, Mero_Aprendiz.

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

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

Boa tarde, Mero_Aprendiz.

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

Obrigado pela força.