2011-12-24 12 views
26

¿Cómo se sirve una imagen, almacenada en mi disco duro, en un servlet?
Por ejemplo:
Tengo una imagen almacenada en la ruta 'Images/button.png' y quiero mostrar esto en un servlet con la URL file/button.png.Salida de un archivo de imagen desde un servlet

+0

¿Conoces la importancia de 'Content-Type' que está configurado en' image/png' o lo que sea que necesites como se menciona en la siguiente respuesta? – Lion

Respuesta

19
  • asignar un servlet a la /file url-pattern
  • leer el archivo del disco de
  • escritura a response.getOutputStream()
  • establecer la cabecera Content-Type a image/png (si es sólo PNG)
45

Aquí está el código de trabajo:

public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { 

     ServletContext cntx= req.getServletContext(); 
     // Get the absolute path of the image 
     String filename = cntx.getRealPath("Images/button.png"); 
     // retrieve mimeType dynamically 
     String mime = cntx.getMimeType(filename); 
     if (mime == null) { 
     resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); 
     return; 
     } 

     resp.setContentType(mime); 
     File file = new File(filename); 
     resp.setContentLength((int)file.length()); 

     FileInputStream in = new FileInputStream(file); 
     OutputStream out = resp.getOutputStream(); 

     // Copy the contents of the file to the output stream 
     byte[] buf = new byte[1024]; 
     int count = 0; 
     while ((count = in.read(buf)) >= 0) { 
     out.write(buf, 0, count); 
     } 
    out.close(); 
    in.close(); 

} 
0

Aquí hay otra manera muy simple.

File file = new File("imageman.png"); 
BufferedImage image = ImageIO.read(file); 
ImageIO.write(image, "PNG", resp.getOutputStream()); 
+1

Esto es muy ineficiente ya que analiza innecesariamente la imagen en un objeto 'BufferedImage'. Este paso no es necesario si no desea manipular la imagen (cambiar el tamaño, recortar, transformar, etc.). La forma más rápida es simplemente transmitir los bytes sin modificar desde la entrada de imagen a la salida de respuesta. – BalusC

Cuestiones relacionadas