como muestro una foto (JPG), almacenada en byte[], en una JSP???

3,460 views
Skip to first unread message

Juan Añasco

unread,
Aug 7, 2006, 7:05:33 PM8/7/06
to jav...@googlegroups.com
Saludos a todos!!

Alguien me podría guiar en la forma de mostrar una fotografía, que está almacenada como byte[] , en una JSP??
Cualquier sugerencia es muy util!!...muchas gracias!!


Esteban Cabezudo

unread,
Aug 7, 2006, 8:21:06 PM8/7/06
to jav...@googlegroups.com

Julio Francisco Veronelli

unread,
Aug 7, 2006, 10:40:42 PM8/7/06
to jav...@googlegroups.com
  Buenas, no tengo tiempo de escribirte bien el código, pero te doy la idea:

<%@page contentType="image/jpeg" import="blahblahblah"%>
<%

  response.setHeader("Content-Disposition","attachment; filename=" + filename);
  OutputStream out = response.getOutputStream();
  //escribir los bytes
  out.flush();
%>

  O sea, seteás el tipo de contenido de la respuesta HTTP, obtenés el OutputStream, y le escribís los bytes. El hecho de que vaya en una JSP en vez de ir directamente en un servlet no te cambia mucho las cosas. Ponés el código entre <% %> y te aseguras que no haya otros tags antes o después (sino, el contenedor te va a lanzar una excepción, pues no se puede escribir al mismo tiempo usando el OutputStream (para bytes) y el Writer (para texto HTML, texto simple, XML, etc.) de la respuesta.

  De todos modos, creo que sería más adecuado un servlet que un JSP. Saludos,

                            Julio

jfinthemix

unread,
Aug 8, 2006, 3:15:55 AM8/8/06
to JavaSOS
Julio, agradezco muchísimo la respuesta, sin embargo no se refiere
precisamente a lo que necesito hacer...me explico un poco más, ojalá
me puedas ayudar por favor:
necesito mostrar la foto en una jsp debido a tengo que mostrar otros
datos mas en la misma pagina(algo así como un curriculum con
fotografía). Tengo todos los datos,pero hasta el momento no he podido
mostrar la foto.Creo que tendría que usar el Writer que mencionas- en
vez del OutputStream del codigo- pero no sé como :|
Gracias.

Julio Francisco Veronelli ha escrito:

Julio Francisco Veronelli

unread,
Aug 8, 2006, 10:51:57 AM8/8/06
to jav...@googlegroups.com
  Si entendí bien lo que querés hacer, creo que andás bastante perdido, te recomiendo interiorizarte un poco más con HTML. Lo que tendrías que hacer es poner un tag <img src="path relativo o absoluto de la imagen.jpg" border="0"/> y listo. El browser buscará la imagen en ese path y la mostrará.

  Si la imagen no está en un archivo accesible por el Web Container, entonces el path debería apuntar a un servlet que te devuelva la imagen (tal y como expliqué antes). Solo que será necesario cambiar el Content-Type a "inline". Saludos,

                    Julio

Julio Francisco Veronelli

unread,
Aug 8, 2006, 10:58:02 AM8/8/06
to jav...@googlegroups.com
  Perdón, lo que hay que cambiar a "inline" es el Content-Disposition (si tenés problemas con eso, quizás hasta debas cambiar el mapeado del servlet a "loquesea.jpg", pero dudo que sea necesario.

  Además de HTML viene bien saber un poco más de CSS. Podés crear interfaces mucho más agradables al usuario, y eso cuenta, ya que por lo general todo le entra por los ojos. Saludos,

                          Julio

SJL

unread,
Aug 8, 2006, 1:42:57 PM8/8/06
to jav...@googlegroups.com
Como algo ya te han dicho, tenes que usar el tag "img" de html, para
apuntar a la "imagen". Yo recientemente he resuelto un problema
similar de la siguiente manera:

en web.xml, agregas un pattern para mapear las url, de por ejemplo, :
htttp://tuAplicacion/images (es decir, /images/*)

y las mandas a un Servlet

ahí mismo podes parsear el URL, por ejemplo yo mando en la url el id
que identifica la imagen:

private void doAction(HttpServletRequest req, HttpServletResponse
resp) throws ServletException, IOException {
//Obtenes la URL
String url = req.getRequestURL().toString();

//Parseo...
String nameFile = url.substring(url.lastIndexOf("/")+1);
String codigo = nameFile.substring(0,nameFile.indexOf("."));
int idImagen = Integer.parseInt(codigo);

//Ejemplo... aca la obtenes de donde la tengas
MiImagen imagen= Aplicacion.getInstance.getImagenes.getImagen(idImagen);

//Importantisimo, aca seteas la salida. Tipicamente "image/jpeg" o "image/gif"
//Busca mime types en google para mas info.
resp.setContentType(imagen.getContentType());

//Escribis en la salida
byte[] image = imagen.getBytes();
resp.getOutputStream().write(image);
}


Espero te sirva...

Retoque rapido mi código para el ejemplo, no se si se me paso algo
pero la idea es que te sirva de guía y creo te puede ayudar.

Saludos!

Sebastián

jfinthemix

unread,
Aug 10, 2006, 11:49:52 PM8/10/06
to JavaSOS
Finalmente lo resolví...y era mucho mas simple de lo esperado. Por si
a alguien le sirve, les muestro mi solución:
Primero hice un servlet(en mi caso particular, un Action de Struts) que
toma la imagen que está almacenada en byte[] y la pone en el response
de la siguiente forma:

byte[] fotoB = usuarioLocal.getFotoUsu(idUsu);

ByteArrayOutputStream output = new ByteArrayOutputStream();

output.write(fotoB, 0, fotoB.length);

response.setContentType("image/jpeg ");
response.setHeader("content-disposition",
"inline; fileName=\"foto.jpg\"");
response.setContentLength(output.size());

//Escribir el archivo en el response
OutputStream out = response.getOutputStream();
output.writeTo(out);
out.flush();
out.close();


La jsp que mostrará la foto simplemente hace referencia al servlet (
en este caso Action) recien mostrado:

<img src="usuarioAction.do?hacia=getFotoUsu&idUsu=<%=
usuario.getIdUsu()%>" width="120px" height="150px" align="right"
alt="fotografía del usuario">

De esta forma, un Action(o servlet) puede entregar los datos para
cargar la JSP con información y otro Action solamente entrega la
imagen.
(nunca pensé que el src del tag img podía referirse a un Action, pero
funciona a la perfeccion)

Reply all
Reply to author
Forward
0 new messages