Download de arquivo

11 respostas
Jaison

Olá pessoal, minha dúvida é a seguinte:

oq eu devo colocar no meu código para que quando eu criar um link para um arquivo no servidor ele aparecer a tela de download ao invés dele abrir o arquivo no browser?

exemplo:

eu tenhu um arquivo nome.txt <— quando eu crio um link para esse arquivo e clico nele, ele abraço no browser!

no php tem algo que se coloca no código pra pedir pra salvar em disco, como eu faço isso em JSP?

abraços!

11 Respostas

esb

E ai Jaison,

Tudo bem?
Cara, eu não sei se isso vai servir pra você, mas você pode fazer um servlet com um método sendo executado a partir de uma requisição feita quando o usuário clicar no link. Neste método você deve ler o arquivo, e enviá-lo na resposta do servidor.

response.setContentType(contentType);
response.setHeader("Content-disposition", "attachment; filename=" + nomeArquivo);
response.setContentLength(arquivo.length);

ServletOutputStream stream = response.getOutputStream();
stream.write(arquivo, 0, arquivo.length);
stream.flush();
stream.close();

Onde nomeArquivo é uma String com o nome do arquivo que você quer que apareça na caixa de download, arquivo é um array de bytes com o arquivo propriamente dito e contentType é uma String com o tipo MIME do arquivo que está sendo enviado para download.

Tomara que ajude…

C

Estou com a mesma duvida, você já conseguiu arrumar.

Agradeço Marcelo

betonit

Possuo um problema interessante com o download q estou fazendo de meu arquivo q é de forma semelhante a já citada. Qd faço o download dele e peço para abrir direto, ele baixa uma espécie de cópia do arquivo original com 0 bytes e dá erro. Se eu escolho o botao salvar e logo após dou um “abrir”, ele abre corretamente. Alguém já teve este tipo de problema?

esb

betonit, dá algum erro?

[]s

betonit

Cara, nda na stacktrace. Nenhum erro detectado…

esb

betonit:
Cara, nda na stacktrace. Nenhum erro detectado…

Bizarro esse erro. Apesar de você dizer que está salvando normalmente, tente debugar e ver o que ocorre. Se o arquivo está sendo enviado corretamente mesmo. Fora isso, está testando em qual navegador? Apesar de achar que isso não tem nada a ver…

betonit

O código que estou utilizando é:

public class DownloadArquivo extends HttpServlet {
	
    private static final long serialVersionUID = 1L;
	
	public void service(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
		try {
            HttpSession session = request.getSession(false);
            if (session == null) {
                throw new SessionException("Sua sess\343o expirou, favor logar novamente.");
            }
            String nu_protocolo = Utilities.parseToString(request, "nu_protocolo");
            String co_relatorio_aplco = Utilities.parseToString(request, "codigoCobol");
            String radioOption = Utilities.parseToString(request, "radioOption");
            ArrayList arrayList = null;
            
            if ( "zip".equalsIgnoreCase(radioOption) ) {
                arrayList = new RelatorioDAO().getZIP(nu_protocolo, co_relatorio_aplco);
                response.setHeader("Content-Disposition", "attachment; filename=" + ((String)arrayList.get(5)).trim() + ".zip");
                response.setContentType( "application/x-zip-compressed" );		
            } else { //pdf
                arrayList = new RelatorioDAO().getPDF(nu_protocolo, co_relatorio_aplco);
                response.setHeader("Content-Disposition", "attachment; filename=\""+((String)arrayList.get(5)).trim()+".pdf\"");
                response.setContentType( "application/pdf" );		
            }
            
            // CFA - Recuperando os parametros correspondente ao campo Blob 
            Blob arquivoBLOB = (Blob)arrayList.get(0);
            InputStream is = (InputStream)arrayList.get(1);
			byte[] arquivo = new byte[ (int)arquivoBLOB.length() ];
			is.read( arquivo );
			
			// CFA - Movendo o arquivo de bytes para um buffer de stream ...
			BufferedOutputStream output = new BufferedOutputStream(response.getOutputStream());
			output.write( arquivo );
			output.flush();
			output.close();
			
			((ResultSet)arrayList.get(2)).close();
			((PreparedStatement)arrayList.get(3)).close();
			((ConnectionJNDIDAO)arrayList.get(4)).closeConnection();
			
		} catch( SQLException se ) {
			se.printStackTrace();
		} catch( IOException ioe ) {
			ioe.printStackTrace();
		} catch( Exception e ) {
			e.printStackTrace();
		} finally {
			this.destroy(); 
		}
	}
}

Já fiz vários testes usando várias classes que herdam a “OutputStream” mas n obtive sucesso. Alguém tem alguma sugestão?!

[]´s

Arcadex

Meu browser em casa sempre dava esse qdo pedia para abrir ao invés de salvar. Acho que o problema não é do seu código e sim, alguma configuração da máquina onde está testando.

Tente fazer o teste em outra máquina OU
tente abrir um arquivo que está em anexo no seu email (por exemplo, um powerpoint) veja se ocorre o mesmo erro…

Abraços a todos.

Arcadex

Uma ajuda…

Alguém sabe como fazer a mesma coisa via [color=red]webservice[/color] ???

Preciso enviar uma mensagem via webservice que atualmente envia apenas dados, e que agora tb precisará enviar um arquivo Excel.

Uso o Axis para gerar o WSDL.

Alguem sabe um manual? Já fez e possa postar o código do WSDL e da implementação do “Server” do Webservice?

Agradeço imensamente qualquer ajuda.
Abraço.

O_Mano

Alguem poderia me ajudar…

preciso enviar um arquivo .xml que está em um determinado diretório do servidor.

como faço isso… olhei os exemplos desta página. mas não consegui…

Tenho na minha servlet um File que é um arquivo xlm. e preciso mandar ele para o cliente

Se alguem poder me ajudar… agradeço.

F

O Mano, implementei esse exemplo, mais estou com um probleminha. Quando salvo o arquivo, toda vez ele me envia o conteudo de meu jsp.
Estou querendo apenas mandar os dados de uma datatable, você sabe dizer como posso fazer isso?

Antes de mais nada obrigado pela ajuda,
fabio Botelho

esb:
E ai Jaison,

Tudo bem?
Cara, eu não sei se isso vai servir pra você, mas você pode fazer um servlet com um método sendo executado a partir de uma requisição feita quando o usuário clicar no link. Neste método você deve ler o arquivo, e enviá-lo na resposta do servidor.

response.setContentType(contentType);
response.setHeader("Content-disposition", "attachment; filename=" + nomeArquivo);
response.setContentLength(arquivo.length);

ServletOutputStream stream = response.getOutputStream();
stream.write(arquivo, 0, arquivo.length);
stream.flush();
stream.close();

Onde nomeArquivo é uma String com o nome do arquivo que você quer que apareça na caixa de download, arquivo é um array de bytes com o arquivo propriamente dito e contentType é uma String com o tipo MIME do arquivo que está sendo enviado para download.

Tomara que ajude…

Criado 16 de junho de 2006
Ultima resposta 31 de jul. de 2008
Respostas 11
Participantes 7