Display dynamic image from database or remote source with p:graphicImage and StreamedContent

前端 未结 4 1708
我寻月下人不归
我寻月下人不归 2020-11-21 11:10

I\'m trying to display image bytes which is saved in database as a StreamedContent in the as follows:



        
4条回答
  •  礼貌的吻别
    2020-11-21 11:54

    There's a couple possibilities here (and please post the entire class if this isn't it).

    1) You're not initializing the image properly 2) Your stream is empty so you're getting nothing

    I'm assuming student.getImage() has a signature of byte[] so first make sure that that data is actually intact and represents an image. Secondly--you're not specifying a content-type which should be "image/jpg" or whatever you're using.

    Here's some boilerplate code to check it with, I'm using Primefaces 2 for this.

    /** 'test' package with 'test/test.png' on the path */
    @RequestScoped
    @ManagedBean(name="imageBean")
    public class ImageBean
    {
        private DefaultStreamedContent content;
    
        public StreamedContent getContent()
        {
            if(content == null)
            {
                /* use your database call here */
                BufferedInputStream in = new BufferedInputStream(ImageBean.class.getClassLoader().getResourceAsStream("test/test.png"));
                ByteArrayOutputStream out = new ByteArrayOutputStream();
    
                int val = -1;
                /* this is a simple test method to double check values from the stream */
                try
                {
                    while((val = in.read()) != -1)
                        out.write(val);
                }
                catch(IOException e)
                {
                    e.printStackTrace();
                }
    
                byte[] bytes = out.toByteArray();
                System.out.println("Bytes -> " + bytes.length);
                content = new DefaultStreamedContent(new ByteArrayInputStream(bytes), "image/png", "test.png");
            }
    
            return content;
        }
    }
    

    and some markup...

    
    
        
    
        
    
        
            
        
    
    

    If that code works then you're set up properly. Despite the fact it is garbage code for the streams (don't use it in production) it should give you a point to troubleshoot from. My guess is that you might have something happening in your JPA or other Database framework where you're byte[] is empty or it is formatted wrong. Alternatively you could just have a content-type problem.

    Lastly, I would clone the data from the bean so that student.getImage() would only be copied into a new array and then used. This way if you have something unknown going on (something else moving the object or changing the byte[] you're not messing with your streams.

    Do something like:

    byte[] data = new byte[student.getImage().length]
    for(int i = 0; i < data.length; i++)
      data[i] = student.getImage()[i];
    

    so that your bean has a copy (or Arrays.copy()--whatever floats your boat). I can't stress enough how something simple like this/content type is usually what's wrong. Good luck with it.

提交回复
热议问题