Carica immagini dall’esterno della cartella webapps / webcontext / deploy utilizzando il tag o

Devo visualizzare le immagini che risiedono al di fuori della cartella di distribuzione nell’applicazione Web utilizzando il o tag HTML JSF. Come posso ottenerlo?

Al punto, deve essere accessibile da un URL pubblico. Pertanto, deve in definitiva riferirsi a un URI http:// , non qualcosa come un file:// URI o così. In definitiva, la sorgente HTML viene eseguita sul computer dell’utente finale e le immagini vengono scaricate individualmente dal browser durante l’analisi del codice sorgente HTML. Quando il browser trova un file:// URI come C:\path\to\image.png , quindi cercherà nel file system del disco locale dell’utente finale l’immagine invece di quella del server web. Questo ovviamente non funzionerà se il browser funziona su una macchina fisicamente diversa rispetto al server web.

Ci sono diversi modi per ottenere questo:

  1. Se si ha il pieno controllo sulla cartella delle immagini, è sufficiente rilasciare la cartella con tutte le immagini, ad esempio /images direttamente nella cartella di distribuzione del servlet container, come ad esempio la cartella /webapps in caso di cartella Tomcat e /domains/domain1/applications in caso di GlassFish . Non è necessaria alcuna ulteriore configurazione.


  2. In alternativa, aggiungi un nuovo contesto webapp al server che punta alla posizione assoluta del file system del disco della cartella con quelle immagini. Come farlo dipende dal contenitore utilizzato. Gli esempi seguenti presuppongono che le immagini si trovino in /path/to/images e che desideri accedervi tramite http: //…/images .

    In caso di Tomcat, aggiungi la seguente nuova voce a /conf/server.xml di Tomcat in :

      

    In caso di GlassFish, aggiungere la seguente voce a /WEB-INF/glassfish-web.xml :

      

    In caso di WildFly, aggiungere la seguente voce all’interno di di /standalone/configuration/standalone.xml

      

    … e più in basso nella voce dello stesso come sopra :

      

  3. Oppure, crea un Servlet che trasmette l’immagine dal disco alla risposta:

     @WebServlet("/images/*") public class ImageServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String filename = request.getPathInfo().substring(1); File file = new File("/path/to/images", filename); response.setHeader("Content-Type", getServletContext().getMimeType(filename)); response.setHeader("Content-Length", String.valueOf(file.length())); response.setHeader("Content-Disposition", "inline; filename=\"" + filename + "\""); Files.copy(file.toPath(), response.getOutputStream()); } } 

    Se ti capita di utilizzare OmniFaces, il FileServlet può essere utile in quanto tiene conto anche delle richieste di head, cache e range.


  4. Oppure, usa OmniFaces che supporta una proprietà bean che restituisce byte[] o InputStream :

     public InputStream getImage(String filename) { return new FileInputStream(new File("/path/to/images", filename)); } 

  5. In alternativa, utilizzare PrimeFaces che supporta un metodo bean che restituisce StreamedContent specifico di PrimeFaces.

     public StreamedContent getImage() throws IOException { FacesContext context = FacesContext.getCurrentInstance(); if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) { // So, we're rendering the view. Return a stub StreamedContent so that it will generate right URL. return new DefaultStreamedContent(); } else { // So, browser is requesting the image. Return a real StreamedContent with the image bytes. String filename = context.getExternalContext().getRequestParameterMap().get("filename"); return new DefaultStreamedContent(new FileInputStream(new File("/path/to/images", filename))); } } 

Per il primo modo e gli approcci Tomcat e WildFly in secondo piano, le immagini saranno disponibili da http://example.comhttps://stackoverflow.com/images/filename.ext e quindi referencable in HTML semplice come segue

  

Per l’approccio GlassFish in seconda e terza opzione, le immagini saranno disponibili da http://example.com/contexthttps://stackoverflow.com/images/filename.ext e quindi referencable in HTML semplice come segue

  

o in JSF come segue (il percorso di contesto viene automaticamente anteposto)

  

Per l’approccio OmniFaces in quarta maniera, fare riferimento come segue

  

Per l’approccio PrimeFaces in quinto modo, fare riferimento come segue:

    

Guarda anche:

  • Modo consigliato per salvare i file caricati in un’applicazione servlet
  • Il modo più semplice per fornire dati statici dall’esterno del server delle applicazioni in un’applicazione Web Java
  • Modello astratto per un servlet di risorse statiche (che supporta la memorizzazione nella cache HTTP)
  • Mostra l’immagine come byte [] dal database come immagine grafica nella pagina JSF
  • Visualizza l’immagine dynamic dal database con p: graphicImage e StreamedContent

Per ottenere ciò che ti serve usando i o , devi creare un alias Tomcat v7 per mappare il percorso esterno al contesto dell’app web.

Per fare ciò, dovrai specificare il contesto dell’app della tua web . Il modo più semplice sarebbe definire un file META-INF / context.xml con il seguente contenuto:

   

Quindi, dopo aver riavviato il server Tomcat, puoi accedere ai file delle immagini utilizzando i > o come segue:

  

o

  

* Nota il percorso di contesto è necessario per il tag ma non per il


Un altro approccio ansible se non si richiede che le immagini siano disponibili tramite il metodo HTTP GET, potrebbe essere utilizzare il Primefaces (usando i tag commandLink o commandButton - metodo HTTP POST ).

Nel tuo Facelet:

      

Nel tuo fagiolo:

 @ManagedBean @ApplicationScope public class FileDownloader { public StreamedContent getStream(String absPath) throws Exception { FileInputStream fis = new FileInputStream(absPath); BufferedInputStream bis = new BufferedInputStream(fis); StreamedContent content = new DefaultStreamedContent(bis); return content; } } } 

In PrimeFaces puoi implementare il tuo bean in questo modo:

 private StreamedContent image; public void setImage(StreamedContent image) { this.image = image; } public StreamedContent getImage() throws Exception { return image; } public void prepImage() throws Exception { File file = new File("/path/to/your/image.png"); InputStream input = new FileInputStream(file); ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext(); setImage(new DefaultStreamedContent(input,externalContext.getMimeType(file.getName()), file.getName())); } 

Nel tuo Facelet HTML:

    

Suggerisco di impostare l’attributo cache = “false” nel componente graphicImage.

In JSP

 "/> 

I pacchetti sono com.sun.jersey.core.util.Base64 , java.nio.file.Paths e java.nio.file.Files .