Visualizza le immagini del BLOB del database in all’interno di

Sto usando PrimeFaces 3.2 su JBoss 7.1.1.

Sto cercando di visualizzare un’immagine che è memorizzata in un BLOB in un database MySQL in . L’immagine viene memorizzata in un byte[] e quindi convertita in StreamedContent come segue:

 InputStream stream = new ByteArrayInputStream(ingredient.getImage()); ingredient.setJsfImage(new DefaultStreamedContent(stream, "image/jpg")); 

Quindi sto cercando di visualizzarlo in una Facelet come segue:

  

...

Tuttavia, durante il caricamento della pagina, ottengo il seguente errore in JBoss:

SEVERE [org.primefaces.application.PrimeResourceHandler] (http – 127.0.0.1-8080-12) Errore nello streaming di risorse dinamiche.

Come è causato e come posso risolverlo?

È necessario rendersi conto che effettivamente il rendering di un elemento con un URL che viene successivamente richiamato individualmente dal browser quando sta per analizzare il markup HTML ottenuto e presentare i risultati.

Quindi, qualunque cosa tu faccia nel metodo getter di deve essere progettata in modo tale che possa essere invocata su una base per ogni richiesta. Quindi, l’approccio più sano sarebbe quello di creare un con un cui il punta una richiesta completamente autonoma o un bean con scope dell’applicazione e il valore indica il identificatore di immagine univoco.

Per esempio

    

Dove il bean backing di Images può apparire come questo:

 @ManagedBean @ApplicationScoped public class Images { @EJB private ImageService service; public StreamedContent getImage() throws IOException { FacesContext context = FacesContext.getCurrentInstance(); if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) { // So, we're rendering the view. Return a stub StreamedContent so that it will generate right URL. return new DefaultStreamedContent(); } else { // So, browser is requesting the image. Return a real StreamedContent with the image bytes. String id = context.getExternalContext().getRequestParameterMap().get("id"); Image image = service.find(Long.valueOf(id)); return new DefaultStreamedContent(new ByteArrayInputStream(image.getBytes())); } } } 

Oppure, se stai già utilizzando OmniFaces 2.0 o versioni successive , prendi in considerazione l’utilizzo di che può essere utilizzato in modo più intuitivo, quasi esattamente nel modo previsto. Vedi anche il blog sull’argomento.

Guarda anche:

  • Visualizza l’immagine dynamic dal database con p: graphicImage e StreamedContent

Non capisco perché ne hai bisogno. Puoi semplicemente creare un servlet che otterrà l’immagine dal database con una mapping “/images/yourimage.jpg”.

Ecco un breve tutorial con un codice corrispondente su come farlo.

JSF – Visualizzazione delle immagini dal database in JSF

Grazie BalusC. Ho fatto questa cosa definendo un numero intero nel backing bean e assegnandogli un valore diverso durante l’aggiornamento di ByteArray per l’immagine. Questo numero intero serve da identificatore univoco per l’immagine. Quindi imposto questo numero intero come valore di all’interno di a pagina.

il tag immagine sembra simile

    ` 

e impostazione dell’immagine nel bean di supporto come

  if(user.getPicture()!=null){ imageId = (int) new Date().getTime(); BinaryStreamImpl bs = new BinaryStreamImpl(user.getPicture()); //picture is byte[] property in user class this.image = new DefaultStreamedContent(bs.getInputStream(), "image/png"); } 

Adesso sta funzionando bene.

Devi tenere a mente ciò che il componente graphicImage rendering sulla pagina. Rende all’elemento HTML . Nel browser, la richiesta verrà effettuata per la pagina JSF, quindi le richieste successive si verificheranno anche per ciascuna delle immagini sulla pagina.

Queste immagini provengono dal servlet delle risorse PrimeFaces e non da FacesServlet, il che significa che l’ambito del Managed Bean e le sue proprietà probabilmente non sono applicabili.

Prova a caricare il blob in un array di byte prima che questo possa iniziare a funzionare.

EDIT: vedere la mia risposta seguente a questa domanda simile. graphicimage non rende streamedcontent in Primefaces

 InputStream is = new ByteArrayInputStream((byte[]) yourBlobData); myImage = new DefaultStreamedContent(is, "image/png"); 

nella pagina jsf;

  

mmm I 99% sicuro che funziona con ui: ripetete avrete molti problemi con questo (perché ho fatto XD), vi consiglio di creare un servlet e servire le immagini come un inputstream (ci sono un molti esempi là fuori).