Salvar imagens no Banco de Dados não é tão simples quanto aparenta, os arquivos de imagens, assim como qualquer dado não-estruturado, são armazenados em campos binários maiores que os normal, e são chamados de BLOB's (Binary Large Objects).
No PostgreSQL utilizamos o bytea para definir as imagens, pois ele não contém nenhum tipo de auto-incremento para os arquivos não-estruturados, então o bytea tem função BLOB, o script da tabela seria a seguinte:
CREATE TABLE arquivo ( id integer NOT NULL, nome character varying, arquivo bytea, CONSTRAINT pk_arquivo PRIMARY KEY (id) ); CREATE SEQUENCE seq_arquivo INCREMENT 1 START 1;
este script mostra a criação de uma tabela "arquivo", que salva arquivos bytea.
Para a manipulação de BLOB's ocorrer o Java utiliza o JDBC , pois este conjunto de classes já tem um modo de converter e locomover os dados não-estruturados.
Para salvar um arquivo de imagem o java busca uma conexão com o banco, depois recebe a imagem e a converte em um conjunto de bytes para que seja reconhecida no banco no modo bytea, e em seguida armazena os bytes.
public boolean insertFile( File f ){ Connection c = this.getConnection();//busca uma conexao com o banco try { PreparedStatement ps = c.prepareStatement("INSERT INTO arquivo( id, nome, arquivo ) VALUES ( nextval('seq_arquivo'), ?, ? )"); //converte o objeto file em array de bytes InputStream is = new FileInputStream( f ); byte[] bytes = new byte[(int)f.length() ]; int offset = 0; int numRead = 0; while (offset < bytes.length && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) { offset += numRead; } ps.setString( 1, f.getName() ); ps.setBytes( 2, bytes ); ps.execute(); ps.close(); c.close(); return true; } catch (SQLException ex) { ex.printStackTrace(); } catch (IOException ex) { ex.printStackTrace(); } return false;}