2012-05-09 25 views
8

Tengo un bean de formulario con atributos id, desc e imageByteArray. Struts action se ejecuta y redirige a un JSP donde quiero acceder a estos atributos de beans como id, desc y convertir el imageByteArray y mostrarlo como una imagen. Intenté esto post, pero eso no funciona para mí.Convertir matriz de bytes base64 a una imagen

I codificar los bytearray usando Base64 - donde this.bean.imageByteArray se refiere a la forma de grano

this.bean.setImageByteArray(new org.apache.commons.codec.binary.Base64().encode(imageInByteArr)); 

yo probamos este, pero no funciona

<img src="data:image/jpg;base64,<c:out value='${bean.imageByteArray}'/>" /> 

matriz de bytes (byte [] imageByteArray) se refiere a una imagen JPG codificada en base64 y obtengo la siguiente etiqueta img como salida y obviamente no se muestra nada,

<img src="data:image/jpg;base64,[[email protected]"> 

¿Alguna idea de cómo convertir una matriz de bytes base64 y mostrarla como una imagen en JSP?

+0

Por favor, use lo que "pero no funciona" significa exactamente. ¿Cómo se veía la salida? ¿Cuál es el tipo de 'imageByteArray'? Supongo que debes llamar a 'encodeString' ... – home

+0

@home Por favor, vea mi comentario – SyAu

+0

Para aquellos que necesitan mostrar una matriz de bytes real (no codificada en base64) como imagen, diríjase a a.o. http://stackoverflow.com/q/2340406 – BalusC

Respuesta

11

Lo que obtienes es solo la salida toString de una matriz. Sin embargo, necesita la matriz de bytes convertida a String.

debe crear un método en el frijol


public String getByteArrayString() 
{ 
    return new String(this.imageByteArray); 
} 

y referencia esto en su JSP.

Si bien técnicamente debe definir qué codificación usar para una matriz de bytes base64, esto no es necesario ya que todos los caracteres están en el rango estándar ASCII de 7 bits.

+0

Excelente. Funciona. Revisé muchas publicaciones de SO relacionadas con este tipo de preguntas, pero no pude ver ninguna respuesta correcta. Me salvaste el tiempo. Gracias. – SyAu

+0

útil ... gracias :) –

+0

Acabo de ver esta respuesta, pero es casi seguro que * no * es lo que hay que hacer aquí. Básicamente se está poniendo dos malas ideas una encima de la otra. El OP ya está realizando la codificación base64, por lo que debería guardarla como * cadena * dentro de su objeto, no como una matriz de bytes. Alternativamente, no deberían codificar64 a base de datos hasta que lo emitan. Básicamente, la conversión correcta es 'byte []' a cadena codificada en base64 - no "byte [] a byte codificado en base64, entonces codificado en ASCII [], luego byte [] a cadena". –

3

La respuesta de DoubleMalt (aceptada en el momento de redactar este documento) es desafortunada, porque está utilizando dos errores para hacer un derecho. No ayuda que Apache Commons Codec hace que sea tan fácil hacer lo incorrecto :(

Base64 es fundamentalmente una codificación de datos binarios a texto - como tal, casi siempre se debe utilizar para convertir un byte[] en un . String Su problema es que se está convirtiendo un byte[] a otro byte[] -., pero más tarde desea utilizar esos datos como una cadena sería mejor para convertir vez, de la manera correcta

ya se puede. elija exactamente cuando convierta a base64 (y una cadena). Podría hacerlo pronto, en su código Java, en cuyo caso usaría:

// Obviously you'd need to introduce a new method for this, replacing 
// setImageByteArray 
this.bean.setImageBase64(new Base64().encodeToString(imageInByteArr)); 
<img src="data:image/jpg;base64,<c:out value='${bean.imageBase64}'/>" /> 

Alternativamente, usted podría guardar sólo los datos binarios en su frijol, y el realizar la codificación en el JSP. Ha pasado mucho tiempo desde que escribí cualquier JSP, así que no voy a tratar de escribir el código para eso aquí.

Pero básicamente, debe decidir si su bean debe mantener los datos binarios originales como byte[], o los datos codificados en base64 como String. Cualquier otra cosa es engañosa, IMO.

Cuestiones relacionadas