Estoy realizando un proyecto para la universidad. Bueno, la duda que tengo es: como puedo mostrar una imagen que tengo almacenada como Blob en una base de datos de MySQL?. Lo he intentado, y al parecer,segun lo que he investigado y revisado en algunas paginas,deberia estar correcto. Al correr la aplicacion, no sale ningun error,al parecer es un error logico, asi que por favor quisiera que me ayuden. A continuacion les dejo parte del codigo para que entiendan un poco la logica que estoy utilizando.
La tabla se llama letras y tiene tres campos:idletras(int),nombre(varchar) y imagen(blob).
Dentro de la aplicacion existe una clase BImagen que representa a una fila de la tabla.
Luego,se tiene la clase DImagen,el cual realiza la conexion a la base de datos y obtiene los datos requeridos.Esta clase tiene tres metodos.El primero es setBImagen(BImagen bean,ResultSet rs),el cual setea un BImagen a partir de un ResultSet (resultado del query en MySQL).
El segundo metodo es listaImagen,el cual retorna un ArrayList
public ArrayList
PreparedStatement pstmt = null;
ResultSet rs = null;
ArrayList
Connection conn = null;
Random random=new Random();//permite obtener un numero aleatorio
try
{//conexion mediante un pool de conexiones
conn =ConnectionPool.getInstance().getConnection();
String sql = "select * from letras";
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
//rs_imagen es un ResultSet estatico para esta clase
this.rs_dimagen=rs;
BImagen bean = null;
//Solo se necesitan 5 imagenes aleatorias
for(int i=1;i<=total_letras;i++)//devuelve 5 imagenes
{ //la variable azar es un random entre 1 y 26
int azar=random.nextInt(25)+1;
System.out.println(azar);
rs.absolute(azar);
bean = new BImagen();
setBImagen(bean,rs);
lista.add(bean);
}
rs.close();
pstmt.close();
}
finally{
if(rs!=null){rs.close(); rs = null; }
if(pstmt!=null){ pstmt.close(); pstmt = null; }
if(conn!=null){ conn.close(); conn = null; }
}
return lista;
}
Y el tercer metodo es getBImagen(String idletras) que devuelve un BImagen segun su id.
Luego se tienen dos servlets.
El primero es SCaptchar, el cual es el que se llama para poder mostrar los datos pedidos. Este solo se encarga de obtener un ArrayList
El segundo servlet es SImagen,el cual se encarga de mostrar la imagen segun el "idletras" enviado desde el JSP.
protected void processRequest(HttpServletRequest request, HttpServletResponse response)throws IOException, ServletException
{
response.setContentType("image/jpeg");
try
{
byte[] datos=null;
ServletOutputStream out=response.getOutputStream();
DImagen dimagen=new DImagen();
String idletras=request.getParameter("idletras");
//obtengo un BImagen segun su id
BImagen bimagen=dimagen.getBImagen(idletras);
Blob blobimagen=bimagen.getImagen();//imagen en blob
datos=new byte[(int)blobimagen.length()];
datos=blobimagen.getBytes(1,(int)blobimagen.length());
out.write(datos);//obtengo la imagen en el servletoutputstream
out.flush();
out.close();
}catch(SQLException sqle){throw new IOException(sqle.getMessage());}
}
En el listImagenes.jsp se tiene lo siguiente:
jsp:useBean id="letras_list" scope="request" type="ArrayList
....
% for(BImagen bean:letras_list){ %
tr
td %=bean.getIdletras()% /td
td %=bean.getNombre()% /td
td
%=bean.getImagen()%
/td
td img src="servlet/com.servlet.SImagen?idletras= %=bean.geIdletrasString()% " width="50" height="80"/ /td
/tr
%}%
....
Al parecer el error esta a la hora de llamar al servlet SImagen desde el JSP, aunque segun lo investigado, estaria bien. He revisado muchas veces el servlet SImagen y no se que es lo que esta mal.
Debo recalcar que el servlet que se llama al comienzo de la aplicacion es SCaptchar. Este servlet si funciona a la perfeccion ya que si se muestran los datos de cada BImagen asi que por lo pronto, no es ningun problema de conexion ni descarga de datos. El unico problema esta al obtener la imagen.
Espero su ayuda.
Gracias





