Solucionado (ver solução)
Solucionado
(ver solução)
15
respostas

Imagens usando JPA

Sei que não foi debatido no curso, porém caso eu necessite gravar uma imagem no banco de dados usando jpa, como devo proceder?

15 respostas

Jilles, acredito não ser uma boa prática pois seu banco de dados irá ficar bem pesado, o ideal que a maioria dos desenvolvedores usam é gravar o caminho da imagem para depois busca-la.

e como fazer isso? kkkk não faço nem ideia de como fazer o upload da imagem salvando apenas o caminho no banco

solução!

Jiles ai ja é um pouco mais complicado, você tem que fazer o upload da imagem e gravar o caminho no banco, explicar pelo forum fica meio dificil mas vou postar as classes e da forma que eu uso:

Primeiro tenho uma classe para representar as imagens:

@ApplicationScoped
public class Image {

    private static final String pasta = "/home/deploy.web/img";
//    private static final String pasta = "/Users/matheus/img";
    private File file;

    public static String getPasta() {
        return pasta;
    }

    public void upload(final UploadedFile[] uploads) {
        // TODO Auto-generated method stub
        for (UploadedFile upload : uploads) {
            upload(upload, "diversos", upload.getFileName());
        }
    }

    public void upload(final UploadedFile upload, final String categoria, final String nome) {
        // TODO Auto-generated method stub
        if (upload != null) {    
            save(upload.getFile(), createFile(categoria, nome));
        }
    }

    public File download(String categoria, String nome) {
        // TODO Auto-generated method stub
        return open(categoria, nome);
    }

    public File show(String categoria, String nome) {
        // TODO Auto-generated method stub
        return download(categoria, nome);
    }

    private void save(InputStream in, File to) {
        // TODO Auto-generated method stub
        try {
            IOUtils.copyLarge(in, new FileOutputStream(to));
        } catch (Exception e) {
            throw new RuntimeException("Error ao salvar a imagem", e);
        }        
    }

    private final File open(String categoria, String nome) {
        // TODO Auto-generated method stub        
        return open(createFile(categoria, nome));
    }

    private final File open(File file) {
        // TODO Auto-generated method stub
        try {
            if (!file.exists()) {        
                throw new FileExistsException(file.getAbsolutePath());
            } else {
                return file;
            }
        } catch (FileExistsException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    private File createFile(String categoria, String nome) {
        // TODO Auto-generated method stub
        return new File(String.format("%s/%s/%s",this.pasta, categoria, nome));
    }

}

Depois no meu controller tenho que receber a imagem:

    @Post("post/salvar")
    @IncludeParameters
    public void salvar(@Valid Post obj, UploadedFile imagem) {
        // TODO Auto-generated method stub
        if (imagem != null) {
            obj.setImagem(imagem.getFileName());
            this.imagem.upload(imagem, "blog", imagem.getFileName());
        }
        super.salvar(obj);
    }

Feito isso tenho que ativar meu form para conseguir enviar a imagem para o servidor adicionando o atributo na tag form:

enctype="multipart/form-data"

Ai tenho um input do tipo file para buscar a imagem:

<input name="imagem" type="file">

Feito isso a mesma ja pode ser upada para o servidor, para mostra-la tenho um controller e método:

@Controller
@Path("imagem")
public class ImageController {

    @Inject
    private Image imagem;

    @Public
    @Get("{categoria}/{nome}")
    public File show(String categoria, String nome) {
        return this.imagem.show(categoria, nome);
    }

    @Public
    @Get("upload")
    public void upload(UploadedFile imagem) {
        this.imagem.upload(imagem, "blog", imagem.getFileName());
    }

}

Espero ter ajudado, tente dar uma olhada nos códigos e ver se consegue ter um note por onde começar.

Boa cara, valew mesmo, vou começar a tentar aqui e ver o que dá Desculpa a demora, só hoje sobrou tempo pa voltar a mexer nisso hehe valew

Magina, qualquer coisa só dar um toque, caso consiga não deixe de marcar o tópico como resolvido para que outros alunos possam utiliza-lo como ajuda.

cara, só me ajuda a entender uma coisa, como esta funcionando essa parte de pasta sua? vc definiu uma pasta fisica direto no atributo, como eu faria para usar o caminho da pasta do servidor?

Jilles esse atributo seria uma pasta fixa que dentro dela vai ter subpastas que eu passo via categoria, indo ao exemplo:

private static final String pasta = "/home/deploy.web/img";

Todas as imagens serão salvas nesse diretório, no seu caso basta começar mudando essa pasta para a sua.

No meu método salvar tenho um IF para verificar se esta sendo enviado uma imagem ou não:

if (imagem != null) {
    obj.setImagem(imagem.getFileName());
    this.imagem.upload(imagem, "blog", imagem.getFileName());
}

Veja que eu chamo o método upload que recebe três parâmetros(Imagem, Categoria, Nome), nesse caso estou passando a categoria blog pois se trata de imagens referente ao meu blog então dentro de /home/deploy/web/img deverá ter uma pasta blog, o método upload chama o método create:

private File createFile(String categoria, String nome) {
    // TODO Auto-generated method stub
    return new File(String.format("%s/%s/%s",this.pasta, categoria, nome));
}

Veja que ele recebe a categoria e nome onde concateno com o caminho do servidor, teríamos algo como:

pasta + categoria + nome
// Pasta            /Categoria/Nome
/home/deploy.web/img/blog/nomeImagem.jpg

Ficou mais claro ?

entendi, mas caso o servidor ( na hora que eu subir a aplicação) nao possua essa pasta, ele cria ela?

Na hora de subir não vai acontecer nada, mas quando for mandar o upload da foto ai sim se a pasta não existir você vai tomar uma exception.

saquei .. saquei... bom deixa eu ver o que consigo hehe :) valew por enquanto

Oi Jiles, tudo bem?

No capítulo 9 do curso de Spring MVC mostra como fazer.

https://cursos.alura.com.br/course/spring-mvc-1-criando-aplicacoes-web/section/9/1

Abraços!

Fala leonardo tudo bem? estou mesmo para começar o curso de spring, só preciso terminar esse projeto antes para ter um pouco de tempo hehe..

Matheus, consegui fazer o upload cara, mto obrigado mesmo, deu certinho :) soh tenho mais uma duvida, como faço para exibir a imagem agora? kkkkkk

Que maravilha Jilles, fico contente, bom vamos lá:

Para mostrar a imagem eu tenho o ImageController:

@Controller
@Path("imagem")
public class ImageController {

    @Inject
    private Image imagem;

    @Public
    @Get("{categoria}/{nome}")
    public File show(String categoria, String nome) {
        return this.imagem.show(categoria, nome);
    }

    @Public
    @Get("upload")
    public void upload(UploadedFile imagem) {
        this.imagem.upload(imagem, "blog", imagem.getFileName());
    }

}

Onde utilizo o método show passando como parâmetros a categoria e nome da imagem, então no src da sua imagem ficaria:

// /imagem = bater no controller
// /blog = categoria, ou seja, subpasta
// post1.jpg = nome da imagem
<img src="<c:url value="/imagem/blog/post1.jpg"/>">

No meu código em produção fica:

<img alt="${obj.post} src="<c:url value="/imagem/blog/${obj.imagem}"/>">

Isso deve dar certo.

Nem precisou converter para DefaultStreamedContent?

Não, só poe esse path no src que ele vai mostrar a imagem.