Imagem no banco de dados

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. :smiley:

[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. :frowning:

]['s