2011-12-24 18 views
26

Come servire un'immagine, memorizzata sul mio disco rigido, in un servlet?
Per esempio:
Ho un'immagine memorizzata nel percorso 'Images/button.png' e voglio servirlo in un servlet con l'URL file/button.png.Emettere un file immagine da un servlet

+0

Conoscete l'importanza di 'Content-Type' impostato su' image/png' o qualsiasi altra cosa avete bisogno come menzionato nella risposta seguente? – Lion

risposta

19
  • mappare una servlet per il /file url-pattern
  • leggere il file dal disco
  • scrittura a response.getOutputStream()
  • impostare l'intestazione Content-Type a image/png (se è solo PNG)
45

Ecco il codice di lavoro:

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

Ecco un altro modo molto semplice.

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

Questo è molto inefficiente poiché analizza inutilmente l'immagine in un oggetto 'BufferedImage'. Questo passaggio non è necessario se non si desidera manipolare l'immagine (ridimensionamento, ritaglio, trasformazione, ecc.). Il modo più veloce è quello di trasmettere in streaming i byte non modificati dall'input dell'immagine all'output di risposta. – BalusC

Problemi correlati