[RESOLVIDO] Exibir Imagens de diretório fora do contexto da aplicação! JSF 2 + Primefaces

Pessoal é o seguinte, eu consigo fazer upload e salvar imagens tanto no banco como em um diretório no build da minha aplicação,
mas tive alguns problemas com Lentidão salvando no banco e uns problemas com deploys feitos sem cuidado salvando no build.!

Agora estou mudando a aplicação para salvar em um diretório que não apague as imagens no deploy, já consigo salvar tudo direitnho, só gostaria de saber
Existe uma forma de Recuperar essas imagens e exibillas na tela pegando direto dessa pasta ou terei que criar um sistema de backup?

Segue o código da forma como estou salvando as imagens!

[code]

public void uploadImagen(FileUploadEvent event)
{

	try
	{
		 
		UploadedFile uf = event.getFile();			 
		InputStream in = new BufferedInputStream(uf.getInputstream());			 
		File file = new File("C://Windows//Temp//ImagesBC//" + uf.getFileName());		
		String caminho = file.getAbsolutePath();			 
		FileOutputStream fos = new FileOutputStream(file);
		 
		while(in.available() != 0)
		{			
			fos.write(in.read());			 
		}			 
		fos.close();			 
	}			 
		catch(Exception ex)
		{			 
			ex.printStackTrace();			 
		}

}[/code]

Se alguém puder ajudar com isso, ou indicar uma solução mais viável (Que acredito que exista) agradeço, por enquanto só estou pesquisando sobre o assunto!

Não sei dizer com outros servidores, mas no glassfish, é possivel criar um servidor virtual onde voce indica a pasta onde estão as imagens, tornando-as acessiveis direto pelo jsf por exemplo apenas colocando:

<p:graphicImage value="/diretorio/img.jpg" />
<p:graphicImage value="/gerais/img.jpg" />

Para isso, voce pode fazer a configuração direto no admin do glassfish, ou no sun-web.xml (glassfish xml).

Ex:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sun-web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 Servlet 2.5//EN" "http://www.sun.com/software/appserver/dtds/sun-web-app_2_5-0.dtd">
<sun-web-app error-url="">
	<context-root>/</context-root>
	<class-loader delegate="true"  />
	<jsp-config>
		<property name="keepgenerated" value="true">
			<description>Keep a copy of the generated servlet class java code .</description>
		</property>
	</jsp-config>
	<parameter-encoding default-charset="UTF-8" />
	<property name="alternatedocroot_1" value="from=/diretorio/* dir=c:\image\imagens\" />
	<property name="alternatedocroot_2" value="from=/gerais/* dir=c:\image\imagens\" />
</sun-web-app>

referencias:
http://docs.oracle.com/cd/E19798-01/821-1758/create-virtual-server-1/index.html

Abrcs.

Ola tarlix !! Obrigado pela dica!

Pesquisei sobre o que você falou! Eu utilizo o Tomcat aqui e acredito que essa seria uma ótima solução!

Consegui criar o diretório virtual mas não sei o que está acontecendo pois não estou conseguindo acessar o conteúdo dentro da pasta!!

Estou criando o diretório assim: no arquivo server.xml

<Context path="/imagesBC" docBase="C:\imagesBC" debug="0" privileged="true" /> 

mais tarde voltarei a mexer nisso e se encontrar uma solução postarei aqui!

abrc!

Realmente não consegui acessar o conteúdo dentro do diretório no tomcat, encontrei alguns exemplos de como criar mas não obtive sucesso!
Sempre me retorna um 404!!
Se alguém tiver conhecimento sobre o tomcat e puder me ajudar nisso agradeço!

abrç!

Fala ae cara!
No tomcat nunca fiz, mas, pelo q vc mostrou o seu docbase nao seria apenas “c:/” e o path: “imagesBC”?
Vc seguiu algum tutorial q eu possa dar uma olhada?
Vou testar aqui, vê se funciona… Qlqr coisa te falo.

Opa!! Segui esse tutorial bem simples na verdade! http://javafree.uol.com.br/artigo/1401/Hosts-virtuais-diretorios-virtuais-no-Tomcat.html
E sobre a barra invertida eu só copiei errado, na aplicação está da forma correta!

Chegou até a criar o Path no Manager!

Ainda não encontrei o porque de não funcionar!!!

Cara, consegui!!! :smiley:

Seguinte, segui esse tutorial : http://harkiran-howtos.blogspot.com.br/2009/08/map-external-directory-into-your.html

Vamos la…

1 - Vá na pasta “C:\Program Files\Apache Software Foundation\Tomcat 7.0\conf\Catalina\localhost” (ou onde voce instalou o seu tomcat)
2 - Crie um arquivo chamado: seu contextpath#nomedodiretorioquevocedeseja.xml
3 - Dentro deste arquivo coloque:
4 - Reinicie o tomcat.

Entendendo:
o nome do arquivo será o "diretorio na url"
Por exemplo, sendo o nome do arquivo ProjectTomCat#imagens#testando.xml
Para acessar o diretorio será: localhost:8080/ProjectTomCat/imagens/testando/nome-do-arquivo-a-ser-acessado-.extesao
dentro deste arquivo, voce colocará o e no docBase o caminho para esta pasta. no exemplo, a minha seria f:imagens.
Sendo que nesta pasta contem o arquivo tarlix.jpg. No jsf ficaria:

<p:graphicImage value="imagens/tarlix.jpg" />

Qlqr duvida, posta ae. Espero que funcione.
Abrcs. =D

Cara funcionou!! Ja havia feito um exemplo parecido mas faltava o meu contexto antes do nome do diretório!!

Muito Obrigado mesmo!!

Opa! Que bom, cara.
Acho que vc consegue utilizar isso para fazer o upload das imagens.

Mais uma coisa, só marca o topico como resolvido.

[RESOLVIDO]

Abrcs.

Olá tarlix,

eu estou usando o glassfish 3.1.2.2

e estou fazendo exatametne o que vc propos no seu post.

porem não esta funcionando para acessar as imagens fora do contexto.

o meu codigo esta assim.

este é somente um exemplo para depois aplicar no projeto.

index.xhtml

[code]<?xml version='1.0' encoding='UTF-8' ?>

Facelet Title [/code]

glassfish-web.xml


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd">
<glassfish-web-app error-url="">
    <context-root>/</context-root>  
    <class-loader delegate="true"  />  
    <jsp-config>  
        <property name="keepgenerated" value="true">  
            <description>Keep a copy of the generated servlet class java code .</description>  
        </property>  
    </jsp-config>  
    <parameter-encoding default-charset="UTF-8" />  
  
    <property name="alternatedocroot_1" value="from=/img/* dir=c:\img\photocam\" />  
</glassfish-web-app>

acredito que esteja tudo correto. porém não funciona
aparece a imagem como não encontrada.

valeu

Cara, as suas pastas estão assim:

C:\img\photocam\img<fotos>?’

outra coisa, agora não consigo testar, mas coloca o h:graphic value sem o / no começo… só pra testar…

[quote=tarlix]Cara, as suas pastas estão assim:

C:\img\photocam\img<fotos>?’

outra coisa, agora não consigo testar, mas coloca o h:graphic value sem o / no começo… só pra testar…
[/quote]

Olá,

no glassfish 4.1 o arquivo glassfish-web.xml mudou de nome ? ñ consigo achar…

Olá Tarlix, estou tendo o mesmo problema e mesmo seguindo suas dicas ainda não consegui resolver. Gostaria de utilizar na configuração do próprio projeto, pois dentro da pasta META-INF já contem o arquivo context.xml o qual eu posso referenciar as minhas imagens. Você conseguiu resolver também desta forma?

Grato!

E ai, tudo bem?

Anderson, faz muito tempo que nao preciso configurar essas coisas no tomcat ou qualquer outro servidor. No meta-inf nunca fiz e não faço ideia de como seja. Porém, voce pode tentar fazer do mesmo jeito que seria feito diretamente no tomcat.

Pelo context que achei em outra pergunta que voce fez, nao consegui entender o que está querendo: Voce tá querendo configurar uma pasta de dentro do proprio projeto ou uma pasta externa? pq a questao no topico é uma pasta externa.

No exemplo que postei como solução do tópico, tem um site que segui para fazer funcionar, acredito que voce tenha feito alguma configuração errada.

Olá amigo Tarlix, tudo bem sim.
Bem sobre a configuração ela é externa, porém eu queria configurar no meu projeto de desenvolvimento para não ter que testar apenas em produção. Sobre a pasta ela é realmente fora do contexto em um diretório externo da aplicação.

Tentei também carregar a imagem através do BLOB mas também não consigo. Nesta solução a minha aplicação fica assim:

	public StreamedContent getImagemContent() throws SystemException, FileNotFoundException{
		return new DefaultStreamedContent(new ByteArrayInputStream(arquivo), "image/jpeg");
	}

<p:graphicImage value="#{noticia.imagem.imagemContent}" />

Mas nada é exibido.

Cara, dessa forma utilizando Blob nao sei o que pode ser. Tem que ver se os bytes estão certos.
O que é essa variavel “arquivo”? qual é o tipo? faz assim: arquivo.getBytes()

Me fala como voce tentou configurar uma pasta externa. Qual nome do arquivo que voce colocou no meta-inf e o conteudo dele.

Por ultimo, mesmo voce estando desenvolvendo localmente, voce pode fazer a configuração no seu tomcat que está utilizando para desenvolver. Normal isso.

arquivo já é o um array de byte, apnas não referenciei o nome correto. rsrsrs

Declarei o meu arquivo server.xml em meu projeto:

<Context docBase="usr/local/arquivos/imagens"/>

Em meu pom.xml eu referenciei o arquivo:

<plugin>
	<groupId>org.apache.tomcat.maven</groupId>
	...
	<configuration>
		<serverXml>${project.basedir}/src/main/webapp/WEB-INF/server.xml</serverXml>
		...
	</configuration>
</plugin>

No meu XHTML eu faço a seguinte chamada:

<p:graphicImage value="#{noticiaBean.noticia.imagem.imagemPath}" />

public String getImagemPath() throws SystemException{
		
	FileUtil.create("/usr/local/arquivos/imagens/" + nome, arquivo, true);

	return new File("/usr/local/arquivos/imagens/" + nome).getPath();

}

Basta colocar exatamente o caminho do ser workspace no dir=

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd">
<glassfish-web-app>
    <context-root>/projeto_web</context-root>
        <property name="alternatedocroot_1" value="from=/* dir=C:\Users\crisnello\workspace\projeto\WebContent\" /> 
</glassfish-web-app>