Transformar campo "Blob" em Imagem‎

alguem sabe como faço transformar campo “Blob” em Imagem‎
em uma aplicação web , to usando spring e apache click
mais a unica coisa q consigo retornar eh o caminho da imagem ao inves da imagem
alguem ajuda??
:roll:

Você gostaria de apenas fazer o donwload por meio de um link ou é exibir a imagem na view?

Caso seja realizar o download segue um metodo onde eu passo uma classe que contem todas as informações quanto o arquivo blob

[code]public void download(ArquivoAudio arquivoAudio){

// seta cabecalho para apresentar o pop-up de download do arquivo
getResponse().addHeader(“Content-disposition”, “attachment; filename=”" + arquivoAudio.getNomeAudio() +""");

	try {
	//Preenche o stream no response.
		BufferedInputStream bufferedInputStream = new
		BufferedInputStream(arquivoAudio.getBlAudio().getBinaryStream());
		byte[] buffer = new byte[3072];
		int count;
		while ((count = bufferedInputStream.read(buffer)) > 0){
			getResponse().getOutputStream().write(buffer, 0, count);
		}
		// Salva o estado da aplicação no contexto do JSF getFacesContext
		getContext().getApplication().getStateManager().saveView(getContext());
		// Fecha o stream do response
		getContext().responseComplete();
	} catch(Exception e) {
			e.printStackTrace();
	}
}[/code]

crie um servlet e to tentando jogar essa imagem pra uma table do apache click
quero exibir a imagem na view ,
recuperar essa imagem que eu ja gravei no banco e jogar na table
:roll:

Oi tudo bem?

dei uma pesquisada e encontrei essa solução talves te ajude:

http://www.guj.com.br/posts/list/130464.java

caso não de certo poste novamente o resultado.

ainda nao funcionou, da uma olhadinha ai
nao estou consiguindo achar o errro :frowning:

meu Servlet

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{
response.setContentType(“image/jpeg”);
ServletOutputStream out = response.getOutputStream();

	    int tamanho = 1;   
	    byte[] buffer = new byte[1024*tamanho];   
	    InputStream is = recuperaFoto();   
	    int bytesread = 0;   
	    while((bytesread = is.read(buffer))!=-1){   
	        out.write(buffer,0,bytesread);   
	    }   
	    out.flush();   
	    out.close();   
	    is.close();   
	}  

public InputStream recuperaFoto(){
String sql = “select imagens_extensao from imagens”;
Connection con = null;
PreparedStatement pst = null;
ResultSet rs = null;
InputStream in = null;

try {   
    
	try {   
        Class.forName("org.postgresql.Driver");                 
        con = DriverManager.getConnection("jdbc:postgresql:SlingControl_NOVO","postgres", "post");  
        
	  
    pst = con.prepareStatement(sql);   
    pst.setLong(1, 3);   
    rs = pst.executeQuery();   
       
    while(rs.next()){   
        Blob blob = rs.getBlob("imagens_arq");   
        in = blob.getBinaryStream();   
    }   
    
	 } catch (Exception ex) {   
         ex.printStackTrace();   
     }  
    
} catch (Exception e) {   
    e.printStackTrace();   
} finally {   
    try{rs.close();}catch(Exception e){}   
    try{pst.close();}catch(Exception e){}   
    try{con.close();}catch(Exception e){}   
}   
return in;   

}

}

Oi, Deka!
Tudo bem?

Bom, eu vejo que você pode fazer uso de uma classe de serviços para fazer essas conversões!
Eu faço uso desses métodos abaixo, quando preciso trabalhar com conversão de imagem, e funciona belezinha:

public class Imagem
{
    public static byte[] converterStringParaBytes(String arquivo) throws Exception
    {
        InputStream input = new FileInputStream(arquivo);
        byte[] buffer = new byte[input.available()];
        input.read(buffer);
        input.close();

        return buffer;
    }
    public static String converterBytesParaString(byte[] bytes) throws Exception
    {
        BASE64Encoder encoder = new BASE64Encoder();
        String arquivo = encoder.encodeBuffer(bytes);
        return arquivo;
    }
    public static Image converterStringParaImagem(String arquivo) throws Exception
    {
        BASE64Decoder decoder = new BASE64Decoder();
        byte[] bytes = decoder.decodeBuffer(arquivo);
        Image imagem = new ImageIcon(bytes).getImage();

        return imagem;
    }
}

Adapte ao seu código e faça os testes, dando um reply também!
Espero ter ajudado! =)

oiii, essa classe se aproxima mais do q eu quero
mais o que teria no seu metodo encodeBuffer ???

vlw pela ajuda

beijoss :lol:

[quote=deka]oiii, essa classe se aproxima mais do q eu quero
mais o que teria no seu metodo encodeBuffer ???

vlw pela ajuda

beijoss :lol:[/quote]

Tá… Diz o que significa o seu método encodeBuffer que a gente cria um parecido com ele!

deka, dei uma olha pela observei que você usou um código de estava bugado eu testei esse codigo postado em um outro tópico e funfou…

1. public class Imagem extends HttpServlet { 2. protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 3. 4. HttpSession ses = request.getSession(); 5. 6. Connection conn = null; 7. PreparedStatement pstmt = null; 8. Blob mapBlob = null; 9. String contentType = ""; 10. String nomArquivo = ""; 11. 12. try { 13. Class.forName("oracle.jdbc.driver.OracleDriver"); 14. conn = DriverManager.getConnection("jdbc:oracle:thin:@<host>:1521:<banco>", "<conta>", "<senha>"); 15. conn.setAutoCommit(false); 16. 17. String cdArquivo = "1"; 18. 19. pstmt = conn.prepareStatement("select bl_arquivo from testeblob where cd_arquivo = ?"); 20. pstmt.setInt(1,Integer.parseInt(cdArquivo)); 21. ResultSet res = pstmt.executeQuery(); 22. 23. if (res.next()) { 24. mapBlob = res.getBlob("BL_ARQUIVO"); 25. } 26. res.getStatement().close(); 27. byte[] arquivo = mapBlob.getBytes(1,(new Long(mapBlob.length())).intValue()); 28. 29. response.setHeader("Cache-Control", "no-store"); 30. response.setHeader("Pragma", "no-cache"); 31. response.setDateHeader("Expires", 0); 32. response.setContentType("image/jpeg"); 33. 34. ServletOutputStream out = response.getOutputStream(); 35. out.write(arquivo); 36. out.flush(); 37. out.close(); 38. 39. } catch (Exception ex) { 40. ex.printStackTrace(); 41. } 42. finally { 43. try { 44. if (conn != null) 45. conn.close(); 46. } 47. catch (Exception e) { 48. } 49. } 50. } 51. }

Basta fazer lá no jsp:

<img src="imagem">

No web.xml:

1. <servlet> 2. <servlet-name>imagem</servlet-name> 3. <servlet-class>Imagem</servlet-class> 4. </servlet> 5. 6. <servlet-mapping> 7. <servlet-name>imagem</servlet-name> 8. <url-pattern>/imagem</url-pattern> 9. </servlet-mapping>

tentar fazer essa alteração…

Olá…

Mais uma opção…

Primeiro tente separar a persistência de sua Servlet. Considerando que você já tenha o blob da imagem…


protected void doProcesso(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        response.setHeader("Pragma", "no-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setContentType("image/bmp");
        
        /* Stream de saida... */
        BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());

        try{

            /* Criando de um byte[]*/
            //Blob blobImage = new SerialBlob(/*byte array da imagem*/);

            /* Caso ja tenha o blob... */
	    ImageIO.write(ImageIO.read(blobImage.getBinaryStream()), 
							"JPG", 
							bos);


         }finally{
        	
        	bos.flush();
        	
        	bos.close();        	
        	
        }

}

Caso não queira utilizar o ImageIO, por questões de compactação etc, basta ler byte a byte a stream do blob e escrever no out da servlet como nos posts anteriores.

Depois é só chamar o mapeamento de sua servlet no ‘src’ da imagem…

T++

OBS: Escrevi o código direto no post, mas sei que a lógica funciona, já utilizei muito.

vlw galera, consegui resolver
imagem gerou certinha no jsp
:smiley: