Como capturar foto do banco e mostrar em 1 jsp?

3 respostas
M

Olá pessoal, estou usando o banco postgres para fazer isso. Já consegui
fazer o upload da foto lá dentro do banco, agora queria saber
como faz para mostrar a foto que ta lá em um jsp.

Vou por aqui como tentei e não consegui:

-----------------------------JPGManeger.java------------------

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageDecoder;

import com.sun.image.codec.jpeg.JPEGImageEncoder;

import java.awt.image.BufferedImage;

import java.io.OutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ByteArrayInputStream;


/**
 * Converter uma sequencia de bytes em JPGE
 */

public class JPGManeger {
   public static void encodeJPG(OutputStream out, byte[] image) throws IOException {
   
   
   int buffer = image.length;
   InputStream fs = new ByteArrayInputStream(image);
   JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(fs);
   BufferedImage bImage = decoder.decodeAsBufferedImage();
   JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
   encoder.encode(bImage);
   fs.close();
   fs = null;
   encoder = null;
   bImage = null;       
       
   }
}

----------------------- exibirImagem.jsp -----------------------

<%@page import="java.lang.*, java.sql.*"%>
    
    <%
        String driver = "org.postgresql.Driver";
        String url = "jdbc:postgresql://localhost:5432/";   
        String user = "usuario";
        String pass = "senha";
    
        try {
        
            int ident = 1;
        
            //carregando o driver jdbc
            Class.forName(driver);
            //estabelecendo conexao
            Connection con = DriverManager.getConnection(url,user,pass);
            System.out.println(con.isClosed());
            
            String sql = "select * from uploads where id =" + ident;
            // criando a sentença de execucao de comandos sql
            Statement stmt = con.createStatement();
            ResultSet rs = stmt.executeQuery(sql);
            if (rs.next()) {
           
           //testar se entrou no if
           System.out.println("transformando");
           
              Blob blob = rs.getBlob("binaryfile");
              JPGManeger.encodeJPG(response.getOutputStream(), blob.getBytes(1, (int)blob.length()) );
                     
           } 
       } catch (Exception e) {
            %> Erro encontrado <%
         }
    
    
    %>

no ident eu usei 1 só para testar. Só tem uma foto no banco de dados.

Segundo 1 tutorial que peguei… para exibir a foto seria /exibirImagem.jsp?ident=x
onde x é o numero da foto me parece…

E ai… o que vocês acham?
Será que alguem teria outra soluçao para me passar?

Obrigado desde já :slight_smile:

3 Respostas

N

Olá maLLuKO,

Segue abaixo uma explicação bem simples:

public class Foto extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		try {
			long id = Long.parseLong(request.getParameter("id"));
			
			// Nesse exemplo usei o Padão de Projeto DAO
			TabelaDAO tabelaDAO = new TabelaDAO();

			// O metodo "getFoto" retorna a imagem em bytes
			// resultSet.getBytes("foto");
			// foto eh um campo BLOB na tabela
			byte[] fotoBytes = tabelaDAO.getFoto(id);
			
			if (fotoBytes != null) {
				OutputStream outputStream = response.getOutputStream();
				outputStream.write(fotoBytes);
				
				outputStream.close();
			}
		} catch (Exception e) {
			response.sendRedirect("erro.jsp?erro=" + e.getMessage());
		}
	}
}

Ae pra usar a foto na jsp seria algo assim

// Nesse caso retornaria a foto do id 1
<img src="foto?id=1"/>

Soh mais uma coisa no código acima “foto” eh o mapeamento para o Servlet “Foto”… no web.xml seria algo assim:

<servlet>
	<servlet-name>foto</servlet-name>
	<servlet-class>pacote.outropacote.Foto</servlet-class>
</servlet>

<servlet-mapping>
	<servlet-name>foto</servlet-name>
	<url-pattern>/foto</url-pattern>
</servlet-mapping>

Qq outra dúvida posta ae…

Valeu,
Neto Rebouças

M

Obrigado pela ajuda Neto :slight_smile:

só que tenho uma dúvida…
essa classe TabelaDAO surgiu de onde?
o que tenho que importar para poder usar uma instancia dela?

obrigado :slight_smile:

N

maLLuKO,

Essa classe foi criada por mim mesmo… ela fica responsável por todo acesso ao banco, entende? Ela tem métodos pra inserir, editar, deletar, recuperar (select)… no exemplo q te passei ela tb tem um método com a seguinte estrutura:

public byte[] getFoto(long id) {
	// Antes tuh deve abrir a conexao com o banco...


	// Cria um PreparedStatement
	PreparedStatement ps = c.prepareStatement(
		"SELECT foto FROM tabela WHERE id = ?");

	// aki tuh tah dizendo q o 1º '?' da cláusula Select vai ter o valor do 'id'
	ps.setLong(1,id);
		
	// Recupera o ResultSet
	ResultSet r = ps.executeQuery();

	byte[] foto = null;
	if (r.next()) {
		// Recupera os bytes da foto...
		foto = r.getBytes("foto");
	}
		
	r.close();
	ps.close();
	
	// Retorna os bytes da foto
	return foto;
}

Trankilo? Qq coisa tamu aki pra ajudar…

Valeu,
Neto Rebouças

Criado 15 de abril de 2006
Ultima resposta 17 de abr. de 2006
Respostas 3
Participantes 2