Salvar imagem com hibernate + jsf + primefaces

12 respostas
jsf
J

Fala galera, sou novo aqui… pesquisei muito e vi vários exemplos, porem não consegui salvar a imagem no banco de dados. então vou postar meu codigo aqui se alguém puder ajudar!

pagina.xhml
<p:fileUpload fileUploadListener="#{prodBena.produto.imagem}" auto=“true"
allowTypes=”.jpg;.png;*.gif;" cancelLabel=“cancelar” uploadLabel=“salvar” label=“proucurar”/>

class controlle

@ManagedBean @SessionScoped public class prodBena implements Serializable {
Produto produto = new Produto();
private TipoProd tipo;
private List<Produto> produtos;
private StreamedContent imagem;


HDAO dao = new HDAO();
public prodBena(){

HDAO dao = new HDAO();

}
public void handleFileUpload(FileUploadEvent event) {
    try {
        produto.setFoto(event.getFile().getContents());
        imagem = new DefaultStreamedContent(event.getFile().getInputstream());
        byte[] imagem = event.getFile().getContents();
        this.produto.setFoto(imagem);
    } catch (IOException ex) {
        Logger.getLogger(GerenciamentoProd.class.getName()).log(Level.SEVERE, null, ex);
    }
}

  

  public void inserir() {
  
    produto.setTipo(tipo);
    dao.inserir(produto);
    this.produto = new Produto();

}
dao generico public class HDAO {
Object object;
Session session;

public HDAO() {
    this.session = HibernateUtil.getSession();
}

public boolean inserir(Object obj) {
    try {
        this.session.beginTransaction();
        this.session.saveOrUpdate(obj);
        this.session.getTransaction().commit();
        return true;
    } catch (Exception e) {
        e.printStackTrace();
        return false;

    }

}


public boolean deleta(Object obj) {
    try {
        this.session.beginTransaction();
        this.session.delete(obj);
        this.session.getTransaction().commit();
        return true;
    } catch (Exception e) {
        return false;
    }
}

public boolean alterar(Object obj) {
    try {
        this.session.beginTransaction();
        this.session.update(obj);
        this.session.getTransaction().commit();
        return true;
    } catch (Exception e) {
        return false;
    }
}

public <T> List<T> buscar(Class<T> c) {
    this.session.beginTransaction();
    try {
        return this.session.createCriteria(c).list();
    } catch (Exception e) {
        return null;
    } finally {
        this.session.getTransaction().commit();
    }
}

public List buscar(String filtro, Object value, boolean ifvalueString, Object obj) {

    if (ifvalueString) {
        value = "%" + value + "%";
    }
    try {
        this.session.beginTransaction();
        List list = this.session.createCriteria(obj.getClass()).add(Restrictions.like(filtro, value)).list();
        this.session.getTransaction().commit();
        return list;
    } catch (Exception e) {
        return null;
    }
}

public Object buscarUnidade(String filtro, Object value, boolean ifvalueString, Object obj) {

    //if(ifvalueString)
    //{ value = "%"+value+"%";}
    try {
        this.session.beginTransaction();
        Object list = this.session.createCriteria(obj.getClass()).add(Restrictions.like(filtro, value)).uniqueResult();
        this.session.getTransaction().commit();
        return list;
    } catch (Exception e) {
        return null;
    }
}

public Object buscar(Object obj, int id) {
    try {
        this.session.beginTransaction();
        obj = this.session.load(obj.getClass(), id);
        this.session.getTransaction().commit();
        return obj;
    } catch (Exception e) {
        return null;
    }
    
}

public Object merge(Object entidade){
    Transaction transacao = null;
    try{
        transacao = session.beginTransaction();
       Object retorno = (Object) session.merge(object);
        transacao.commit();
        return retorno;
    }catch (RuntimeException erro){
        if(transacao != null){
            transacao.rollback();
        }
        throw erro;
    }finally{
        session.close();
    }
    
    
    
}

}

Bom galera todos os campos estão salvando porem a imagem não vai!

12 Respostas

J

ninguém pode da uma força!

Mike

Salva o caminho no banco e a imagem numa pasta

FearX

A dica que eu te dou é: Não salve imagens em banco de dados a não ser que seja extremamente necessário. Motivos não faltam, vale a pena dar uma estudada nisso. Não tem jeito de você salvar numa pasta ou num filesystem?

PS: Salve apenas o path da imagem no seu BD.

J

Mike e FearX obrigado por responderem! pode ser da forma em que vcs citaram…salvar o caminho da imagem. Vcs tem algum exemplo? como ficaria no @ManagedBean e XHTML.

Mike

No momento não.

Você esta usando JPA? Se sim, na sua classe cria dois atributos, um String que vai ser o caminho e um StreamedContent que vai ser a própria imagem, o StreamedContent você anota com @Transient para a JPA ignora-lo.

Ai você pode pegar a imagem com um FileInputStream e então conseguir uma instancia de StreamedContent

J

Sim estou usando JPA!
Fiz assim! private String diretorio;
private String caminho;
private byte[] arquivo;
private String nome;

public UploadArquivo() {
}

public String getNome() {
    return nome;
}

public String getRealPath() {
    ExternalContext externalContext
            = FacesContext.getCurrentInstance().getExternalContext();
    HttpServletResponse response
            = (HttpServletResponse) externalContext.getResponse();

    FacesContext aFacesContext = FacesContext.getCurrentInstance();
    ServletContext context
            = (ServletContext) aFacesContext.getExternalContext().getContext();

    return context.getRealPath("/");
}

public void fileUpload(FileUploadEvent event, String type, String diretorio) {
    try {
        this.nome = new java.util.Date().getTime() + type;
        this.caminho = getRealPath() + diretorio + getNome();
        this.arquivo = event.getFile().getContents();

        File file = new File(getRealPath() + diretorio);
        file.mkdirs();

    } catch (Exception ex) {
        System.out.println("Erro no upload do arquivo" + ex);
    }
}

public void gravar() {

    try {

        FileOutputStream fos;
        fos = new FileOutputStream(this.caminho);
        fos.write(this.arquivo);
        fos.close();

    } catch (Exception ex) {
        System.out.println(ex);
    }

}
Chamei ela no bean List prods = new ArrayList(); private UploadArquivo arquivo = new UploadArquivo();
HDAO dao = new HDAO();

public void uploadAction(FileUploadEvent event) {
    this.arquivo.fileUpload(event, ".jpg", "/imagens/");
    this.prod.setFoto(this.arquivo.getNome());
}

public void inserirProd() {

    prod.setTipoProduto(tipo);
    
    dao.inserir(prod);
    prod = new Produto();
    this.arquivo = new UploadArquivo();

}
no Xhtml fiz assim.

na Class persistente eu mudei o tipo da imagem para String foto.

no banco esta salvando um 1540913472274.jpg e quando chamo na tela ele retorna o mesmo nome do banco e não a imagem!

Mike

Você vai pegar a imagem através do caminho que você recebeu do banco.

Se o caminho é: C:/projeto/imagem01.png, então você deve achar a imagem que possua esse caminho

J

Como descubro o caminho, já que só aparece isso 1540913472274.jpg no banco?
e depois de achar como chamo o caminho na aplicação?

Mike

Se você só salva o nome do arquivo, logo só vai aparecer o nome do arquivo.

Se baseia no exemplo abaixo:

private String caminhoPasta = "C:/imagens/";
...
String caminhoImagem = caminhoPasta + file.getName();

meuObjeto.setCaminhoImagem(caminhoImagem);

salvarNaPasta(caminhoImagem, file);//FileOutputStream
salvarNoBanco(meuObjeto);
meuObjeto = pegarObjetoDoBanco();

String caminhoImagem = caminhoPasta + meuObjeto.getCaminhoImagem();
FileInputStream fis = new FileInputStream(caminhoImagem);
//Depois instancia um StreamedContent passando o FileInputStream como parâmetro
J

achei o caminho porem quando chamo <h:graphicImage value="./imagens/#{lista.foto}"/> vem uma imagem que não abre.image

Mike

O caminho esta errado então, você esta salvando a imagem a onde?
h:graphicImage não abre imagem de uma outra pasta, apenas a do projeto

o p:graphicImage abre imagens externas e você pode usar o streamedContent no atributo value

J

Essa pasta está dentro do projeto. Criei a pasta imagem dentro de build/web/imagens eu entrei na pasta as imagens estão sendo salvas lá.

Criado 27 de outubro de 2018
Ultima resposta 31 de out. de 2018
Respostas 12
Participantes 3