Caminho da aplicação para imagem

2 respostas
A

Estou desenvolvendo uma aplicação com jsf2, tomcat7.

Testei os seguintes comandos para saber o caminho relativo da aplicação e retornou o caminho onde o eclipse esta instalado, quando deveria retornar o local onde o tomcat esta instalado

File file = new File(".");
System.out.println(file.getAbsolutePath());   // retorna 'C:\biblioteca\eclipse'
System.out.println(file.getCanonicalPath());
System.out.println(System.getProperty("user.dir")); // retorna tb 'C:\bibliocate\eclipse'

Meu objetivo no final é criar um diretorio para poder salvar imagens, que o usuário fará upload pelo site.
Isto, ou salvar no bd a imagem em um campo blob, mas depois eu nao saberia como colocar a imagem na tag,
por exemplo,

<h:graphicImage value"endereço da imagem" /> // O q colocar no value se a imagem estiver no bd, no diretorio é possivel colocar no caminho relativo

[]s

2 Respostas

A

Para upload:

ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
System.out.println(servletContext.getRealPath(""));
//vai mostrar a raiz do teu projeto;

Quanto à localização das imagens, você define, não existe um lugar próprio, mas para se referir à estas imagens, utilize o nome completo do caminho:

&lt;h:graphicImage value"/resources/img/usuario/*.jpg" /&gt;

em outros casos:

&lt;h:graphicImage value"/NomeDoSeuProjeto/resources/img/usuario/*.jpg" /&gt;
A

andre.froes:
Para upload:

ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
System.out.println(servletContext.getRealPath(""));
//vai mostrar a raiz do teu projeto;

Valeu andre.froes mostrou o caminho direitinho da aplocação mesmo. Obrigado

Em relação as fotos, como o user vai fazer um upload de uma imagem no meu web/inf eu teria que ter uma pasta e guardar as imagens naquele local, guardando o caminho respectivo de cada imagem no bd. Mas se eu fizer um deploy no server, eu não perderia esta pasta com as imagens???

Eu acabei optando por colocar a imagem no bd e exibi-la com um componente do primefaces graphicImage.
Depois de muitas tentativas e buscas em foruns eu consegui fazer a imagem ser mostrada no meu xhtml.

As imagens estão salvas em um campo Blob do meu MySQL.

No meu Xhtml, eu passo como parâmetro o id de uma entidade do banco de dados onde esta contida a imagem.

&lt;p:graphicImage value="#{imagemBean.image}"&gt;
	&lt;f:param  name="id"  value="#{b.idEmpresa}" /&gt;
&lt;/p:graphicImage&gt;

Aqui é onde eu estava errando eu mandava para o graphicImage um StreamedContent com a imagem direto, depois de muito pesquizar e analisar é que consegui achar a resposta, infelizmente nenhum exemplo do prime ou da documentação explicitam isso, ainda mais integrando com banco de dados.

public class Image implements Serializable{
       private static final long serialVersionUID = 1L;
       
        public StreamedContent getImage() throws IOException {
        FacesContext context = FacesContext.getCurrentInstance();

        if (context.getRenderResponse()) {
           //Então, quando renderizar a view, retorna para o graphicImage um StreamedContent. 
           return new DefaultStreamedContent();
        }
        else {
             // Quando o browser pedir uma imagem, retorne um StreamedContent com a imagem
            String id = context.getExternalContext().getRequestParameterMap().get("id");
            EmpresaDAO empresaDAO = new EmpresaDAOImpl();
            Empresa empresa = empresaDAO.getById(Empresa.class, Integer.valueOf(id));
            return new DefaultStreamedContent(new ByteArrayInputStream(empresa.getImagem()));
        }
    }
}

A vantagem é que agora minhas imagens ficam no banco de dados. Provavelmente, perderei performace do sistema ao fazer isso, bom vou ver como isso vai ficar aqui.
Dependendo do que acontecer posto aqui de novo.

[]s

Criado 4 de setembro de 2012
Ultima resposta 5 de set. de 2012
Respostas 2
Participantes 2