Gravar imagem no banco PostgreSQL

Olá pessoal,

Eu sei que isso deve ser meio batido… Mas já procurei no google, no fórum e não consigo achar o problema…

Estou querendo inserir imagens a partir de uma aplicação desktop no banco de dados PostgreSQL…

Eu gostaria que me dissessem qual o tipo do campo que eu devo criar no PostgreSQL…
Jà tentei lo, bytea e oid mesmo sem saber ao certo o que é cada um… Mas em nenhum deu certo…

Meu método está assim:

public void addCasca(Casca casca) throws Exception {
        PreparedStatement pstmt = null;
        String sql;
        FileInputStream fis;

        try {
            
            File f = new File((String) casca.getFotoCasca());
            fis = new FileInputStream(f);

            sql = "INSERT INTO CASCA (caracteristica, desenvolvimento, nome_casca, foto_casca)" +
                    "VALUES (?,?,?,?)";
            pstmt = super.getConexao().prepareStatement(sql);

            pstmt.setString(1, casca.getCaracteristica());
            pstmt.setString(2, casca.getDesenvolvimento());
            pstmt.setString(3, casca.getNomeCasca());
            pstmt.setBinaryStream(4, fis, fis.available());

            pstmt.executeUpdate();
        } finally {
            if (pstmt != null) {
                pstmt.close();
            }
        }
    }

Entre os tres tipos de campo, apenas com o bytea não gera excessão mas o campo fica em branco quando eu dou um select…

Nos outros dois que citei, geram as seguintes excessões:
“column “foto_casca” is of type lo but expression is of type bytea” e “column “foto_casca” is of type oid but expression is of type bytea”

Se alguém puder me ajudar, por favor me diga qual o campo que deve ser declarado no PostgreSQL e apontar o erro se houver algum no código apresentado…

Agradeço desde já,
DanielSR

Olá,

bom primeiramente você deve considerar duas coisas:
bytea - tem um limite de aproximadamente 1mb (eu não me lembro onde li sobre isso).
large object (lo) - para objetos maiores.

O problema é a forma que o sgbd trata as duas coisas, bytea são mantidos nas tabelas, enquanto que os lo são armazenados em uma tabela única do sistema. Ou seja, se você tiver 3 tabelas no banco, usando lo, então o conteúdo será armazenado um uma tabela do sistema (se não me engano pg_largeobject). E onde mora o perigo, a associação da tabela com a tabela do sistema é feito pelos OID. Eu já tive problemas no passado com recuperação de arquivos em que usava o oid como sincronização (usando o recurso inherited).

Bom, com relação ao uso do java para acessar e manusear os campos bytea, temos os exemplos e links a seguir:

File image = new File( filename ); FileInputStream fis = new FileInputStream(image); ps.setBinaryStream(4, fis, (int) image.length());

Do manual do postgresql:
http://jdbc.postgresql.org/documentation/80/binary-data.html

links sobre o tema:
http://www.infoblogs.com.br/view.action?contentId=23302&Bytea-±PostgreeSQL-±Hibernate–Persistindo-pequenas-imagens-em-um-BD
http://www.guj.com.br/posts/list/54493.java
http://www.guj.com.br/posts/list/56822.java

fw

Obrigado Dieval Guizelini pela ajuda…

Eu conferi o código que eu havia feito com o do link do postgresql q vc passou e estava igual… O código estava correto só que como eu dava select no banco (pelo pgAdmin) e o campo da imagem estava branco eu achava que não havia sido inserida a imagem…
Dae eu fui num dos outros links q vc me passou e eu tentei recuperar a imagem pro disco e confirmei que as imagens estavam sendo salvas no banco…

Obrigado pela atenção…