Olá, alguem poderia me ajudar?
Quero saber se tem como eu gravar imagem no banco de dados (firebird)
usando java?
Sei que existe o tipo de dado Blob no firebird, mas como faria para pegar uma imagem e gravar neste campo?
Desde jah agradeço?
Imagem no banco de dados
11 Respostas
Não é melhor apenas passar o endereço da imagem pro banco de dados?
afinal isso iria sobrecarregar o sistema e como, imagina a cada select ter q tirar a imagem do banco…
Ok, mas para fazer isso a imagem terá q sempre estar em algum lugar no micro, além do mais, naum são muitas imagens e o sistema que estou desenvolvendo naum eh muito grande.
Sei que tem como salvar a imagem no banco, mas naum sei como eu trataria isso em java.
Ok, mas para fazer isso a imagem terá q sempre estar em algum lugar no micro, além do mais, naum são muitas imagens e o sistema que estou desenvolvendo naum eh muito grande.Sei que tem como salvar a imagem no banco, mas naum sei como eu trataria isso em java.
Cara, tente não fazer isso. Independente de estar no SGBD ou num arquivo isolado, sua imagem vai estar em disco.
Acesso em disco já é lento, acesso à um SGBD é muito mais lento, fora que o banco fica super inchado.
Quanto à sua dúvida, se ainda desejar fazer assim, como são estas imagens? Arquivos GIF, JPG, etc?
[]s
Não é melhor apenas passar o endereço da imagem pro banco de dados?afinal isso iria sobrecarregar o sistema e como, imagina a cada select ter q tirar a imagem do banco…
Olá,
O normal é o banco somente referenciar o local da imagem, e controlar leitura e gravação neste arquivo. O firebird não faz isso? :roll:
]['s
Ok, entaum seria mais intressante gravar apenas o caminho da imagem?
Entaum eu poderia pegar a imagem informada e copia-la para uma outra pasta padrão e sempre pegar as imagens de lá, certo.
Vou fazer assim entaum, obrigado!!!
ah, as imagens seriam mais JPG e BMP
Para salvar as imagens no banco de dados
PreparedStatement stm = null;
FileInputStream fio;
try {
fio = new FileInputStream(new File("/caminho/imagen.jpg"));
stm.setBinaryStream(0, fio, fio.available());
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
para retornar a imagem
ResultSet result = null;
try {
Image img = Toolkit.getDefaultToolkit().createImage(
result.getBytes(0));
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
sendo que o campo da imagem tem de ser do tipo BLOB ou equivalente em seu SGBD,Tanto as expressões do PreparedStatement quanto a do ResultSet tem de conter o nome da sua imagem Ex:“INSERT INTO IMAGEM …”,“SELECT IMAGEM FROM …”
blza!
falow
Não é melhor apenas passar o endereço da imagem pro banco de dados?afinal isso iria sobrecarregar o sistema e como, imagina a cada select ter q tirar a imagem do banco…
Olá,
O normal é o banco somente referenciar o local da imagem, e controlar leitura e gravação neste arquivo. O firebird não faz isso? :roll:
]['s
Vendo o código do anjomal eu acho que não…
Discordo um pouco sobre pôr ou não imagens na base.
Dependendo do número de imagens, e do banco de dados que você tem, é realmente melhor ter as imagens na base.
Se você tem mais de 1000 (ou 3000, depende do filesystem) arquivos em um diretório, seu desempenho fica realmente sofrível, e você precisa usar um monte de truques (como criar um monte de sub-sub-sub-diretórios para colocar os arquivos).
Na verdade há dois problemas com imagens na base:
- campos BLOB não são muito bem suportados em diversos drivers JDBC. Por exemplo, o driver JDBC para o Oracle não suporta direito o tipo java.sql.Blob, você precisa usar oracle.sql.BLOB. Não sei como é o caso do FireBird, provavelmente não deve ter problemas.
- se você vai deletar e inserir um monte de imagens, você pode ter de dar uma olhada como é que o seu banco lida com a reutilização do espaço usado. Normalmente não deve ter problemas, mas alguns bancos são bem bobinhos e o que ocorre é que de vez em quando você precisa usar um utilitário para “compactação”.
Ok thiagol,
Serão poucas imagens, vou fazer uns testes das duas maneiras e ver qual ficará melhor.
Obrigado a todos. 
Discordo um pouco sobre pôr ou não imagens na base.
Dependendo do número de imagens, e do banco de dados que você tem, é realmente melhor ter as imagens na base.
Por que é melhor?
Não é necessário ter uma estrutura bizarra de subdiretórios. Coloque tudo em um por relação e deixe o nome do arquivo como a chave primária do registro.
O desenvolvimento centrado em banco de Dados é pobre e fortemente acoplado, este é o grande problema.
[]s
Mas isso não é bem um problema da Oracle e sim que ela quer te forçar a usar as classes dela. É o mesmo caso para retornar as PL/Table do banco que no Java se transformam em Array.
Quanto mais preso ao drive tu ficar melhor pra eles. 
]['s