Download de arquivos em java! URGENTE

2 respostas
D

Pessoal,

estou com um problema sério!
Fiz uma aplicação que tem o objetivo principal de fazer uploads e downloads de documentos.
Testei tudo em casa e até aí tudo blz… o problema foi quando eu implantei o sistema.
Acontece que quando o cliente clica para fazer o download do arquivo, este é gravado em um diretório no servidor e não na máquina do usuário.
Em casa eu não peguei esse erro porque estava tudo em uma máquina só. Meu problema é como fazer o download do arquivo, uma vez que esse arquivo está no banco de dados?

Alguem tem uma sugestão?

Obrigado

2 Respostas

M

Crie um servlet com o seguinte trecho:

Conexao cnct = new Conexao();
try {
  cnct.conecta();
  PreparedStatement sql=cnct.conn.prepareStatement("SELECT arquivo,nome_arquivo FROM tbl_anexo where id_anexo="+request.getParameter("id_anexo"));
  ResultSet rs = sql.executeQuery(); 

     if (rs.next()) {
         Blob blob = rs.getBlob(1);

      byte[] blobData = blob.getBytes(1, (int)blob.length());
      String nome = rs.getString(2).replaceAll(" ", "_");
      
      String caminho = (getServletContext().getRealPath("/anexos/") + nome);

      //Now you got your data in blobData... write to file
       java.io.FileOutputStream fileOut = new java.io.FileOutputStream(caminho);
       fileOut.write(blobData);
       
       //System.out.println(caminho);
            
   		// aqui deve ser configurado direito, baseado no tipo do arquivo
   		response.setContentType("application/download");
   		//response.setContentType("multipart/form-data");       

  		 // mude "attachment" para "inline" para mostrar direto no browser
  		 String arq = "attachment;filename="+ nome;
   		response.setHeader("Content-Disposition", arq);
   		//response.setHeader( "Content-Disposition", "inline;filename="+nome+"");  

  		ServletOutputStream os = response.getOutputStream();
  		os.write( blobData );
  		os.close();
  
  		cnct.conn.close();
  
  		java.io.File file = new java.io.File(caminho);
  		file.delete();  
  		}
	}finally {		        
    	try{cnct.conn.close();}
    	catch(Exception e){e.printStackTrace();}
}
D

Obrigado Marcelo

Já consegui resolver o problema. Foi exatamente da forma que vc descreveu, mas eu não criei um servlet pra isso. Mas já está funcionando

Obrigado novamente

Criado 27 de dezembro de 2006
Ultima resposta 27 de dez. de 2006
Respostas 2
Participantes 2