Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Upload de imagem correto? exibição da imagem ?

Fala pessoal tudo bem? Seguinte tenho um projeto onde em uma tela eu cadastro uma categoria para o produto. Cada categoria terá uma imagem para representa-la. Bom criei um formulário, e usando o componente fileUpload do primefaces, faço upload do arquivo, onde no meu listener eu pego o diretorio que a imagem esta sendo gravada e seto como um string na minha entidade Categoria-->Imagem Ficando desse jeito:

public void fileUploadCategoria(FileUploadEvent event) {
       try {

        String pasta = System.getProperty("user.home");
        String diretorio = "/uploads/categorias";
        File diretorioFinal = new File(pasta + diretorio);

        if (!diretorioFinal.exists()) {
            diretorioFinal.mkdirs();
        }

        Path folder = Paths.get(pasta + diretorio);
        String fileName = FilenameUtils.getBaseName(event.getFile().getFileName());
        String extension = FilenameUtils.getExtension(event.getFile().getFileName());
        Path file = Files.createTempFile(folder, fileName + "-", "." + extension);

        String caminho = file.toString();
        caminhoDaImagem(caminho);

        try (InputStream input = event.getFile().getInputstream()) {
            Files.copy(input, file, StandardCopyOption.REPLACE_EXISTING);
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Sucesso", "Categoria inserida com êxito !"));

        }

    } catch (Exception e) {
        System.out.println("Erro no upload da imagem: " + e);
    }
}

O que acontece, ele esta salvando no banco o caminho completo da imagem, por exemplo: quando dou um select em minhas categorias

ID - 1 Titulo = "Alimentação" Imagem = "C:\Users\Jilles Ragonha\uploads\categorias\ALimentacao-4269576342313247658.jpg Descrição = " Mercados,Lanchonetes,Padarias, etc"

Minha dúvida é a seguinte, esta correto salvar o caminho absoluto assim? Outra coisa, como faria para exibir essa imagem de volta, quando eu recuperar a lista de todas as categorias? Uma vez que o h:graphicImage e o p:graphicImage não conseguem ler uma imagem que está fora da pasta do projeto?

1 resposta
solução!

Boa tarde Jiles,

Em relação a pergunta sobre onde salvar, você salvar sim fora do projeto, o problema é justamente como servir essa mensagem... Basicamente vc teria que fazer a imagem apontar para um endereço dentro da sua aplicação, possivelmente um servlet, que carregasse o arquivo de fora e retorna os bytes .. Complicado né?

Então um jeito mais simples é vc salvar essa imagem num serviço externo que já entenda http, para vc apontar os links diretamente. Para brincar, eu uso um chamado S3 Ninja => http://s3ninja.net/ que simula o Amazon S3 para você.

Um último jeito, que eu não recomendo pq não é legal para produção, é você gravar imagem dentro da sua própria aplicação. Através do FacesContext vc pode acessar o ServletContext e recuperar o caminho da sua aplicação.