image jsf bytearray

Mostrar imagen como byte[] de la base de datos como imagen gráfica en la página JSF



bytearray (2)

Tengo contenido de imagen como byte[] de la base de datos.

private byte[] image;

¿Cómo puedo mostrar esa matriz de bytes como una imagen gráfica real en la página JSF?


Esto no es directamente posible con <h:graphicImage> . Solo puede apuntar a una URL, no a un byte[] ni a InputStream . Básicamente, debe asegurarse de que esos bytes estén directamente disponibles como una respuesta HTTP en la URL dada, que luego puede usar en <h:graphicImage> (o incluso HTML <img> ).

Siempre que esté identificando la imagen por su ID de esta manera:

<h:graphicImage value="/image/#{someBean.imageId}" />

Aquí hay un ejemplo inicial de tal servlet:

@WebServlet("/image/*") public class ImageServlet extends HttpServlet { @EJB private ImageService service; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Long id = Long.valueOf(request.getPathInfo().substring(1)); Image image = service.find(id); response.setContentType(getServletContext().getMimeType(image.getName())); response.setContentLength(image.getBytes().length); response.getOutputStream().write(image.getBytes()); } }

En esta respuesta se puede encontrar una plantilla abstracta más avanzada para un servlet de recursos estáticos, que admite el almacenamiento en caché HTTP, junto con un ejemplo concreto para servir desde la base de datos.

Si utiliza la biblioteca de utilidades JSF OmniFaces en un entorno JSF 2.2 + CDI, puede utilizar su <o:graphicImage> que puede utilizarse de manera mucho más intuitiva.

<o:graphicImage value="#{imageBean.getBytes(someBean.imageId)}" />

@Named @ApplicationScoped public class ImageBean { @EJB private ImageService service; public byte[] getBytes(Long imageId) { return service.getImageBytes(imageId); } }


Simplemente vincule una variable de cadena a la imagen en la interfaz de usuario.

<img src="data:image/png;base64, "#{imageString}">

Por ejemplo, está cargando el byte de imagen [] desde la base de datos y luego lo codifica primero en la cadena base 64.

String imageString= new String(Base64.encodeBase64(byte array fetched from database));