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?
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.
[quote=“jfnando”]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.[/quote]
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
[quote=“Shneider”]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…[/quote]
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
[quote=“fabgp2001”][quote=“Shneider”]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…[/quote]
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[/quote]
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.
[quote=“thingol”]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.[/quote]
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