Show image as byte[] from database as graphic image in JSF page

前端 未结 2 1041
轻奢々
轻奢々 2020-11-28 14:12

I have image content as byte[] from database.

private byte[] image;

How can I show that byte array as a real graphic image in

相关标签:
2条回答
  • 2020-11-28 14:27

    This is not directly possible with <h:graphicImage>. It can only point to an URL, not to a byte[] nor InputStream. Basically, you need to make sure that those bytes are directly available as a HTTP response on the given URL, which you can then use in <h:graphicImage> (or even plain HTML <img>).

    Provided that you're identifying the image by its ID like so:

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

    Here's a kickoff example of such a 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());
        }
    
    }
    

    A more advanced abstract template for a static resource servlet, supporting HTTP caching, can be found in this answer, along with a concrete example for serving from database.

    If you happen to use JSF utility library OmniFaces on a JSF 2.2 + CDI environment, then you can instead use its <o:graphicImage> which can be used much more intuitively.

    <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);
        }
    
    }
    
    0 讨论(0)
  • 2020-11-28 14:40

    Just bind one String variable to image on UI.

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

    For example you are loading the image byte[] from database then first encode it in base 64 String.

    String imageString= new String(Base64.encodeBase64(byte array fetched from database));
    
    0 讨论(0)
提交回复
热议问题