2012-03-01 27 views
11

estoy usando streamedcontent para hacer un byte enviado desde JSF luego enviarlo de vuelta como un contenido de transmisión de la siguiente manera:graphicimage no volviendo streamedcontent en Primefaces

<p:graphicImage value="#{manage.bytesToStreamedContent(car.image)}"/> 

donde la imagen es el conjunto de bytes de la imagen almacenada en la base de datos

respaldo de frijol:

public StreamedContent bytesToStreamedContent(byte[] bytes) 
{ 
    InputStream is = new ByteArrayInputStream(bytes); 
    StreamedContent image = new DefaultStreamedContent (is, "image/jpeg"); 
    return image; 
} 

Pero ahora no recibo la imagen en la página JSF. Aparece este mensaje en el registro del servidor:

ADVERTENCIA: JSF1091: No se pudo encontrar ningún tipo de mimo para el archivo dynamiccontent. Para resolver esto, agregue una asignación tipo mimo a las aplicaciones web.xml.

y:

SEVERE: Error in streaming dynamic resource. 

puede usted por favor me ayude a cabo aquí, no puedo encontrar ninguna información útil con respecto a este tema

PS:

Im usando las siguientes bibliotecas:

Mojarra 2.1.3

PrimeFaces 3.1.1

Glassfish 3.1

+0

posible duplicado de [Problemas de imagen burbuja de base de datos que muestran en Primefaces graphicimage] (http://stackoverflow.com/questions/10073905/problems-displaying-database-blob-image-in -primefaces-graphicimage) – BalusC

+0

Preguntas relacionadas/duplicadas: http://stackoverflow.com/questions/8207325/display-image-from-database-with-pgraphicimage/, http://stackoverflow.com/questions/10073905/problems- displaying-database-blob-image-in-primefaces-graphicimage, http://stackoverflow.com/questions/10944673/how-to-use-pgraphicimage-with-defaultstreamedcontent-in-an-uirepeat/, http: // stackoverflow .com/questions/8304967/cómo-usar-pgraphicimage-with-streamedcontent-within-pdatatable/ – BalusC

+1

@BalusC pero ¡esta publicación es más antigua que algunas de las preguntas "relacionadas" que has mencionado! – fareed

Respuesta

10

Encontrado donde estaba el problema. El problema no estaba en la imagen gráfica. Fue porque la etiqueta graphicimage se está cargando dinámicamente (problema similar cuando se intenta cargar desde datatable). Las imágenes dinámicas no se pueden representar directamente en datatable o datagrid. (La solución es asignar un parámetro y traer las imágenes de la identificación).

Sin embargo, la solución es here

3

En general, no es una gran idea para crear el StreamedContent en el captador de graphicimage. La imagen se buscará en una solicitud separada del resto del contenido, lo que significa que las variables que dependen de los iteradores no funcionarán. Esto significa que en la llamada relevante a bytesToStreamedContent la matriz de bytes será nula/vacía. Si coloca puntos de interrupción dentro del método, probablemente verá que en la última llamada no hay datos en bytes.

Debe asegurarse de que la imagen se genera mientras aún tiene acceso a todo el contenido necesario y luego almacenarlo de manera que lo recupere nuevamente en bytesToStreamedContent. Si esto solucionará el problema y realmente funciona para usted es difícil de decir sin ver el resto del código. Comenzaría tratando de eliminar el argumento de matriz de bytes y devolver una imagen estática para confirmar que este es el problema.

+0

los bytes provienen de la base de datos en primer lugar y se pasan a JSF. Luego, desde JSF estoy enviando una solicitud para mostrar como contenido transmitido para ver la imagen. Sin embargo, traté de leer el archivo como un flujo de entrada de la aplicación sourceFiles y crear un add para el contenido de flujo continuo, pero todavía no se procesó. Finalmente, traté de obtener el archivo directamente de la fuente estática de la siguiente manera: y esta vez se procesó correctamente. ¿Qué piensas? – fareed

+0

si se usa algo como InputStream is = new FileInputStream ("C: \ images \ lemontree.jpg"); no ayuda, realmente no tengo idea de lo que está mal. Lo que más me preocupa es que el parámetro car.image no funcione como crees. – MatsT

4

Este es un problema extraño y no creo que agregar el tipo mime a web.xml lo arreglará. Está clasificada como tanto un error en PrimeFaces con un objetivo de 3,2

http://code.google.com/p/primefaces/issues/detail?id=3546

Y también aparece como un error accesible en Mojarra 2.1.1. Hay un parche enviado para este error, pero parece que tendrá que aplicar manualmente el código al origen de Mojarra 2.1.1 y compilarlo. Uno pensaría que esto se solucionaría en 2.1.3, sin embargo, Glassfish puede tener su propia implementación de Mojarra preempacada que todavía está en una versión earler y su aplicación puede estar usando esto en su lugar.

http://java.net/jira/browse/JAVASERVERFACES-2103

EDIT:

Usted puede simplemente pasar el byte [] directamente como un argumento para el método por el estilo.Sin embargo, lo que puedes hacer es pasar la identificación del automóvil como un param y luego recuperar ese coche y buscar los bytes de la entidad del coche. La razón de esto es porque el graphicImage en realidad se representa como una etiqueta HTML img y esto ocurre en una solicitud HTTP separada de la solicitud de la página JSF. Descargue e instale el complemento Firebug para Firefox y verá que esto ocurre, se solicita la página y luego se producen las solicitudes de las imágenes después de que se recupera la página. Debido a esto, no se puede acceder a los beans ViewScoped y RequestScoped de esta manera, sin embargo, un parámetro de solicitud aún se puede pasar con la información necesaria para recuperar los bytes de Car para la imagen.

<p:graphicImage value="#{manage.bytesToStreamedContent}"> 
<f:param name="item_id" value="#{car.id}" /> 
</p:graphicImage> 

Ahora en su propiedad bean administrado, usted puede obtener el identificador de auto, y después de obtener el identificador de coche que debería ser capaz de conseguir el coche adecuado.

public StreamedContent getBytesToStreamedContent() { 
    String id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("item_id"); 
    //Now get the car with the id 
} 
+1

¿Cuáles son mis opciones para presentar mi matriz de bytes como imagen en la página jsf? – fareed

+2

@fareed Consulte la edición de mi respuesta anterior. Creo que quizás puedas estar usando la imagen gráfica incorrectamente. –

+1

Intenté lo que sugirieron aquí pero obtuve el mismo resultado. También traté de obtener la imagen con pasar una cadena definida directamente desde el bean de respaldo y estoy obteniendo lo mismo, no está renderizando. Realmente atrapado con este – fareed