[Resolvido] Caminho para imagens no VRaptor 3

9 respostas
Guevara

Olá pessoal!
Estava usando uma pasta no hd para salvar fotos numa boa, agora quero salvá-las dentro do contexto da aplicação, seguindo a apostila do VRaptor fiz o método:

@Component
public class Imagens {

	private File pastaImagens;
	
	public Imagens() {
	}
	
	public Imagens(File pastaImagens) {
		this.pastaImagens = pastaImagens;		
	}	

	public Imagens(ServletContext context) {			  		 
		String caminhoImagens = context.getRealPath("/WEB-INF/imagens");
		pastaImagens = new File(caminhoImagens);
		pastaImagens.mkdir();

	}	

public InputStream mostraAvatar(Imovel imovel) throws FileNotFoundException {		
		return new FileInputStream(new File(pastaImagens, imovel.getAvatar().getUrlFoto()));
	}

No Controller envio o avatar assim:

@Path("/avatar/{codImovel}")
	public InputStream mostraAvatar(Long codImovel) throws FileNotFoundException {
		Imovel imovel = imovelDAO.carrega(codImovel);
		return imagens.mostraAvatar(imovel);
	}

Mas recebo o seguinte erro na stacktrace ao chamar o método para mostrar o avatar na JSP:

Caused by: java.io.FileNotFoundException: 350.42598d20-95df-420b-95d1-7c1878fbd9f8.north-bay-road-house-1.jpg (No such file or directory)
	at java.io.FileInputStream.open(Native Method)
	at java.io.FileInputStream.<init>(FileInputStream.java:106)
	at br.com.imobiliaria.component.Imagens.mostraAvatar(Imagens.java:83)

A pasta imagens em /WEB-INF/imagens existe e as fotos estão lá, mas mesmo assim não faz o stream, já dei um “refresh” no projeto, dei um clean tb, mesmo assim não acha. Sabem o que poderia ser?
Abraço!!

9 Respostas

G

Guevara, tudo bem? :smiley:

Uma coisa que você precisa entender é que quando você usa uma IDE, ela nunca usa o diretório padrão do servidor, e sim um diretório temporário. A cada deploy esse diretório é limpo e a aplicação é instalada novamente. Sendo assim tudo que você salvou lá será perdido.

No caso do tomcat, o Eclipse cria algo como /home/otavio/eclipsew/.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapps/vraptor-blank. Porém o meu projeto está em /home/otavio/eclipsew/vraptor-blank. No momento que vocẽ faz um deploy a aplicação é copiada para outro local e você assim vai. Quando vocẽ fazer outro deploy será tudo copiado novamente e o que estava lá removido.

O ideal é você salvar no banco, se tua infraestrutura permitir. Caso contrário, salve em um local fixo… etc.

Guevara

Beleza Garcia! \o/
Não entendi isso, na própria apostila FJ-28 o exemplo usa o contexto da aplicação, as imagens não seriam recuperadas? Eu não uso o Tomcat instalado mas sim como slave do Eclipse, eu starto o Eclipse e ele usa o Tomcat. As imagens deveriam aparecer na JSP. Se eu hospedasse o projeto não poderia salvar as fotos em /WEB-INF/imagens? Teria que usar uma pasta no servidor ou salvo em /WebContent/imagens ?
Abraço!

G

Olha, boa pergunta. Eu sempre guardo no banco de dados as imagens, já que minha vida inteira trabalhei com aplicações distribuidas.

Mas se eu tivesse que armazenar na aplicação, eu colocaria em algum lugar qualquer, pode ser mesmo no WEB-INF/imagens. Porém é aquela história que te falei… quando tu usar deploy via eclipse terá esse porém de a cada vez que você fazer um deploy vai perder as imagens.

Porém em produção isso não irá acontecer dependendo da forma que você usar a aplicação. Se você usar via WAR sempre que você fizer um deploy irá perder as imagens. Se você usar deploy por diretório isso não acontecerá.

Uma coisa que você pode fazer é configurar na sua máquina um local fixo para o upload das imagens. E em ambiente de produção você usa normalmente o caminho da aplicação.

Guevara

Saquei, vou deixar do jeito que estava então, salvando na minha home mesmo, e quando hospedar crio uma pasta no servidor para salvar as imagens. Uma pena, pq em outras linguagens, tipo, PHP, as fotos podem ficar dentro do contexto da aplicação, como não existe esse negócio de deploy, só é atualizado o que foi alterado e o resto fica intacto, sem reiniciar nada.
Obrigado pelas dicas!
Abração!! o/

Lucas_Cavalcanti

o que a gente costuma fazer é criar um arquivo properties de configuração (ou usar um que já exista), e colocar uma propriedade apontando para uma pasta qualquer do servidor…

aí na sua máquina vc pode colocar em uma pasta, no servidor de teste em outra pasta, e no servidor de produção outra pasta. Mas o caminho da pasta tem que ser absoluto.

Guevara

Oi Lucas!!
Saquei, aqui eu uso no meu desktop /home/bruno/fotos, ai lá na hospedagem eu coloco o caminho para a pasta de acordo com o domínio, certo? Tipo:
http://ipDoDominio/fotos
[]s

Lucas_Cavalcanti

não, no servidor vc coloca em uma pasta dentro do servidor…

tipo:
/usr/aplicacao/fotos

Guevara

Beleza Lucas!
Valeu pelas dicas!
Abraço!

G

Tem uma receita aqui para isso.
http://vraptor.caelum.com.br/cookbook/componentfactory-como-seletor-de-implementacoes/

Criado 16 de outubro de 2010
Ultima resposta 17 de out. de 2010
Respostas 9
Participantes 3