Tengo un problema de que las imágenes registradas en mi base de datos mysql no se muestran, tengo una tabla y entre esa tabla tengo una columna de fotos y quiero listarla junto con mis otras columnas pero no puedo encontrar la solución al problema a continuación Agrego código de mi método ArrayList y la llamada en mi jsp y el resultado
Método de mi clase
public ArrayList<CitaVO> listarCitas(String cliente_idCliente) {
CitaVO citVO = null;
conexion = this.obtenerConexion();
ArrayList<CitaVO> listaCitas = new ArrayList<>();
try {
sql = "SELECT * FROM vwcitasactivas WHERE cliente_idCliente=?";
puente = conexion.prepareStatement(sql);
puente.setString(1, cliente_idCliente);
mensajero = puente.executeQuery();
while (mensajero.next()) {
citVO = new CitaVO(mensajero.getString(1),
mensajero.getString(2), mensajero.getBinaryStream(3),
mensajero.getString(4), mensajero.getString(5),
mensajero.getString(6), mensajero.getString(7),
mensajero.getString(8), mensajero.getString(9),
mensajero.getString(10), mensajero.getString(11),
mensajero.getString(12),cliente_idCliente);
listaCitas.add(citVO);
}
} catch (Exception e) {
Logger.getLogger(ProAgendaDAO.class.getName()).log(Level.SEVERE, null, e);
}
return listaCitas;
}
jsp donde enumero los resultados
<%
CitaVO citVO = new CitaVO();
CitaDAO citDAO = new CitaDAO();
ArrayList<CitaVO> listaCitas = citDAO.listarCitas(idCliente);
for (int i = 0; i < listaCitas.size(); i++) {
citVO = listaCitas.get(i);
%>
<tr>
<td>
<div class="round-img">
<a href=""><img src="<%=citVO.getUsuFoto()%>" alt="" width="50px" height="50px" ></a>
</div>
</td>
<td><%=citVO.getUsuNombre()%> <%=citVO.getUsuApellido()%></td>
<td><%=citVO.getUsuCiudad()%></td>
<td><%=citVO.getCitFecha()%></td>
<td><%=citVO.getProDia()%></td>
<td><%=citVO.getCitDireccion()%></td>
<td><%=citVO.getCitHoraInicio()%></td>
<td><%=citVO.getCitHoraFin()%></td>
<td <%=citVO.getCitEstado()%>><span class="badge badge-primary">Activa</span></td>
<td>
<span><a href="Cita?opcion=6&textId=<%=citVO.getIdCita()%>&textEstado=<%=citVO.getCitEstado()%>"><i class="ti-eye color-default"></i></a> </span>
<span><a href="Cita?opcion=7&textId=<%=citVO.getIdCita()%>"><i class="ti-pencil-alt color-success"></i></a></span>
<span><a href="Cita?opcion=3&textId=<%=citVO.getIdCita()%>&textEstado=<%=citVO.getCitEstado()%>" class="btn sweet-confirm" onclick="return cancelarCita(event)"><i class="ti-trash color-danger"></i> </a></span>
</td>
</tr>
<%}%>
Hola,
Una imagen guardada como BLOB en la base de datos no se puede meter directamente en un <img src="...">, porque src necesita una URL a la que el navegador pueda hacer una petición HTTP normal, no bytes crudos incrustados en el HTML de la página. La solución es crear un servlet aparte que, dado un id, lea el BLOB de la base de datos y lo escriba directamente en la respuesta HTTP con el tipo de contenido correcto:
@WebServlet("/imagen")
public class ImagenServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String id = request.getParameter("id");
try (Connection con = obtenerConexion();
PreparedStatement ps = con.prepareStatement("SELECT foto FROM tu_tabla WHERE id = ?")) {
ps.setString(1, id);
ResultSet rs = ps.executeQuery();
if (rs.next()) {
response.setContentType("image/jpeg");
byte[] datos = rs.getBytes("foto");
response.getOutputStream().write(datos);
}
} catch (SQLException e) {
throw new ServletException(e);
}
}
}
Y en tu JSP, en vez de intentar mostrar el BLOB directamente, apuntas la imagen a ese servlet pasándole el id:
<img src="imagen?id=${producto.id}" alt="Foto del producto">
Cuando el navegador procesa el <img>, hace una petición HTTP normal a /imagen?id=123, el servlet consulta ese registro concreto, y devuelve los bytes de la imagen con el Content-Type correspondiente. El navegador no sabe (ni le importa) que esos bytes salieron de un BLOB en vez de un fichero en disco, para él es una imagen normal.
Un detalle a ajustar según tu caso: si guardas fotos de distintos formatos (JPEG, PNG...), tendrías que guardar también el tipo MIME en otra columna de la tabla, en vez de fijar "image/jpeg" siempre, para que el Content-Type sea el correcto en cada caso.
David Carrero