Carregar imagens de fora da pasta webapps / webcontext / deploy usando a tag ou

Eu preciso exibir imagens que residem fora da pasta de implementação no aplicativo da web usando JSF tag ou HTML tag. Como posso conseguir isso?

Para o ponto, tem que ser acessível por um URL público. Assim, o deve, em última análise, referenciar um http:// URI, não algo como um file:// URI ou algo assim. Por fim, a fonte HTML é executada na máquina do enduser e as imagens são baixadas individualmente pelo navegador durante a análise da origem HTML. Quando o navegador encontrar um file:// URI, como C:\path\to\image.png , ele procurará no próprio sistema de arquivos do disco local do C:\path\to\image.png pela imagem em vez de pelo servidor da web. Obviamente, isso não funcionará se o webbrowser for executado em uma máquina fisicamente diferente do servidor da web.

Existem várias maneiras de conseguir isso:

  1. Se você tiver controle total sobre a pasta images, então solte a pasta com todas as imagens, por exemplo /images diretamente na pasta deploy do container servlet, como a pasta /webapps no caso do Tomcat e /domains/domain1/applications pasta /domains/domain1/applications no caso do GlassFish . Nenhuma configuração adicional é necessária.


  2. Ou adicione um novo contexto de aplicativo da Web ao servidor que aponte para o local do sistema de arquivos do disco absoluto da pasta com essas imagens. Como fazer isso depende do contêiner usado. Os exemplos abaixo assumem que as imagens estão localizadas em /path/to/images e que você gostaria de acessá-las via http: //…/images .

    No caso do Tomcat, adicione a seguinte nova input ao /conf/server.xml do Tomcat dentro de :

      

    No caso do GlassFish, adicione a seguinte input em /WEB-INF/glassfish-web.xml :

      

    No caso do WildFly, adicione a seguinte input em de /standalone/configuration/standalone.xml

      

    … e mais abaixo na input do mesmo como acima :

      

  3. Ou crie um Servlet que transmita a imagem do disco para a resposta:

     @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 acontecer de você usar o OmniFaces, o FileServlet pode ser útil, pois ele também leva em conta as solicitações head, caching e range.


  4. Ou use o OmniFaces que suporta uma propriedade de bean retornando byte[] ou InputStream :

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

  5. Ou, use PrimeFaces que suporta um método de bean que retorna StreamedContent específico de 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))); } } 

Para a primeira maneira e as aproximações do Tomcat e do WildFly na segunda maneira, as imagens estarão disponíveis em http://example.comhttps://stackoverflow.com/images/filename.ext e, portanto, podem ser referenciadas em HTML simples da seguinte forma

  

Para a abordagem GlassFish na segunda via e na terceira via, as imagens estarão disponíveis em http://example.com/contexthttps://stackoverflow.com/images/filename.ext e, portanto, podem ser referenciadas em HTML simples como segue.

  

ou no JSF da seguinte forma (o caminho do contexto é automaticamente prefixado)

  

Para a abordagem OmniFaces na quarta maneira, faça referência da seguinte forma

  

Para a abordagem PrimeFaces em quinto modo, faça referência como segue:

    

Veja também:

  • A maneira recomendada para salvar arquivos enviados em um aplicativo de servlet
  • Maneira mais simples de fornecer dados estáticos de fora do servidor de aplicativos em um aplicativo da Web Java
  • Modelo abstrato para um servlet de resources estáticos (suportando o armazenamento em cache HTTP)
  • Mostrar imagem como byte [] do database como imagem gráfica na página JSF
  • Exibir imagem dinâmica do database com p: graphicImage e StreamedContent

Para obter o que você precisa usando as tags ou , é necessário criar um alias do Tomcat v7 para mapear o caminho externo para o contexto do seu aplicativo da web.

Para fazer isso, você precisará especificar o contexto do seu aplicativo da web . O mais fácil seria definir um arquivo META-INF / context.xml com o seguinte conteúdo:

   

Depois de reiniciar o servidor Tomcat, você pode acessar seus arquivos de imagens usando as tags > ou seguinte forma:

  

ou

  

* Observe que o caminho do contexto é necessário para a tag, mas não para o


Outra abordagem possível se você não requerer que as imagens estejam disponíveis através do método HTTP GET, poderia ser usar a tag Primefaces (usando as tags commandLink ou commandButton - método HTTP POST ).

No seu Facelet:

      

No seu bean:

 @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; } } } 

No PrimeFaces você pode implementar seu bean desta maneira:

 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())); } 

No seu facelet de HTML:

    

Sugiro definir o atributo cache = “false” no componente graphicImage.

No JSP

 "/> 

Os pacotes são com.sun.jersey.core.util.Base64 , java.nio.file.Paths e java.nio.file.Files .

Intereting Posts