Fotos na base de dados!

Boas pessoal,

Estou com uma curiosidade : Como irei colocar fotografias numa base de dados ?
Tenho uma lista de 200 trabalhadores e cada um deles tem uma fotográfia sua digitalizada e gostaria de guardar estas fotos na base de dados.

O objectivo é : quando eu faço um select ao ID do trabalhador ele me tras todos os dados do trabalhador correspondente ao ID incluindo a fotografia.

Alguem me pode dar uma ajuda com isto ?

Obrigado desde ja !

Existem alguns tópicos criados sobre isso, dá uma busca no fórum , e vê se tem algo que lhe ajude.

Um tópico útil, é esse aqui.

Abraço,

opa… vamos ver se eu te ajudo…

eu precisei guardar imagens no banco de dados também, e fiz da seguinte maneira:

  • O atributo que eu uso para armazenar a imagem na classe é um array de bytes, e tenho um do tipo ImageIcon também:
private byte[] foto;
private ImageIcon fotoEspecie;
  • na classe também tenho um método que já me retorna um ImageIcon, pra não ter que fazer isso em todo lugar que eu for usar a imagem:
public ImageIcon getFotoAsImageIcon(){
        
        this.fotoEspecie = new ImageIcon();
        
        if(this.getFoto() != null){            
            this.fotoEspecie = new ImageIcon(this.getFoto()); 
        }       
               
        return this.fotoEspecie;
}
  • pra gravar no banco eu uso o seguinte comando:
stmtCadastrar.setBytes(2, imagemEspecie.getFoto());
  • pra recuperar do banco, uso o seguinte:
...
     InputStream input = resultSet.getBinaryStream("mgm_imagem");

     if(input != null){

           ByteArrayOutputStream output = new ByteArrayOutputStream();
           // set read buffer size

           byte[] rb = new byte[1024];
           int ch = 0;

           while ((ch = input.read(rb)) != -1){	
                  output.write(rb, 0, ch);
           }

           // transfer to byte buffer
           byte[] b = output.toByteArray();
           input.close();
           output.close();
           umaImagemEspecie.setFoto(b);                     
      } 
...

o banco que eu utilizo aqui é o PostgreSQL

espero que ajude de qualquer forma

[]'s :thumbup:

Pra uma aplicação Web… o que é melhor? Guardar em banco ou numa pasta separada?

vlw!

Não guarde as fotos, salve-as em disco e apenas coloque o nome do arquivo no registro do SGBD.

Eu faço assim… crio uma pasta chamada fotos e o nome da foto é o id do usuário… assim não preciso gravar nada no banco…

também concoro com essa abordagem… mas quando nos é imposto o “como fazer”… precisamos fazer :smiley:

e quando você precisa de mais de uma imagem para um usuário/peça/algo_que_precise_de_foto?

[quote=Luiz_Gustavo][quote=pcalcado]
Não guarde as fotos, salve-as em disco e apenas coloque o nome do arquivo no registro do SGBD.
[/quote]

também concoro com essa abordagem… mas quando nos é imposto o “como fazer”… precisamos fazer :smiley:

e quando você precisa de mais de uma imagem para um usuário/peça/algo_que_precise_de_foto?

[/quote]

Eu fiz assim, nome do arquivo orginal + chave primaria da nova linha da tabela foto = nome do arquivo no diretorio que eu escoli, assim nunca vou ter nome de arquivo repitido

Eu discordo dessa abordagem de guardar a imagem em diretorios e
apenas o caminho no bd, e o pessoal aqui deveria mostrar os prós e
contras pro cara escolher, e não ja ir falando USE ASSIM E PONTO FINAL!!!

As imagens vem sendo alvo de vários estudos relacionados a sua captura 
dentro de um banco de dados. Por exemplo, encontrar num banco com 
100.000 imagens aquelas que possuam um círculo vermelho, ou encontrar 
as que possuam alguma pessoa com o olho azul. Também vendo sendo 
muito estudado os possíveis melhores algoritmos para se indexar imagens.


Vantagens de se armazenar em banco as imagens:


. Organização: as imagens ficam armazenadas dentro do banco, não ficam
 espalhadas por diretórios.


. Excluindo um registro você exclui a imagem também, não precisando 
encontrar a imagem nos diretórios e excluí-la manualmente. Essa 
vantagem é relativa, pois também se pode criar um trigger em C, 
pl/Python, pl/Perl ou outra linguagem que exclua a imagem ao deletar um 
registro.


. O backup fica mais fácil de ser feito, não precisa ficar procurando nos 
diretórios as imagens para serem incluídas no backup. Muitos argumentam
 que imagens no banco tornam o backup gigantesco, mas de qualquer 
forma terão que ser feitas cópias das imagens. Dentro ou fora do banco, o
 backup ficará grande.


. Rapidez: o desempenho é melhor com imagens dentro do banco.


. Segurança: armazenar imagens nos diretórios do sistema operacional 
pode trazer insegurança e inconsistências, principalmente se várias 
pessoas tenham acesso ao servidor. Com as imagens guardadas no banco
 é mais fácil restringir a um determinado usuário o acesso às imagens.


Vantagens de se armazenar em diretórios as imagens:


. Em alguns casos que as imagens são poucas, é mais fácil trabalhar com 
elas fora do banco.


. O vacuum pode tornar-se um pouco mais rápido.


. Não são todas as linguagens que tem funções prontas para capturar e 
mostrar a imagem que está no banco de dados. Linguagens como PHP, por
 exemplo, você tem que extrair a imagem, jogar numa pasta temporária e
 depois mostra-la. 

Fonte

[quote=fredferrao]Eu discordo dessa abordagem de guardar a imagem em diretorios e
apenas o caminho no bd, e o pessoal aqui deveria mostrar os prós e
contras pro cara escolher, e não ja ir falando USE ASSIM E PONTO FINAL!!!
[/quote]

Ok, eu realmente achei que ficaria claro, mas vamos discutir os tais prós.

Seu banco de dados suporta isso? Qual o custo dessas operações? Qual a complexidade? principalmente: isso faz parte dos seus requisitos?

Falácia. Se eu tenho uma tabela de imagens ou um diretório apra armazená-las dá no mesmo em termos de organização. Se eu aplicar um modelo hierárquico mais organziado com sub diretórios seria mais organizado, inclusive.

Ok, teríamos uma transação distribuída bem simplezinha, mas realmente se seu filesystem não possui robustez pra aguentar a deleção de uma imagem eu espero que seu banco de dados não fique na mesma máquina.

Falácia. Backup do diretório de imagens? Cronjob que zipe o diretório.

Você reclama que eu não esclareço meu ponto e aceita isso como vantagem? Qual banco? qual filesystem? Qual aplicação? Qual o tamanho das imagens? Qual o tamanho do banco? Quantos hits? Cadê o benchmark? Cadê os dados?

Isso é puro achismo.

Falácia. Dê permissão de acesso ao diretório apenas apra o usuário da aplicação, poxa vida até no windows dá pra fazer isso!

Falácia. Por que seria mais fácil trabalhar com muitas imagens dentro do banco?

O que é vacuum, o tempo que uma imagem demora para parecer numa página?

Ok, eu não dei vantagens mas…por favor este cara só colocou opiniões e nem mostrou fatos que se baseou para concluir isso.

OK, essas são as opniões do cara, mas o que mais pesa na minha opnião e que voces SEMPRE ESQUECEM é que nem todo mundo trabalha em grandes empresas para grandes empresas com seus servidores dedicados com normas de segurança e etc…, muito pelo contrario existem milhares de pequenas e até médias empresas que o servidor é apenas um P4 melhorzinho, e existe até estação de trabalho como servidor, imagina um monte de arquivos de imagem numa maquina dessas!!!

Lembrem-se tem usuario de todo o Brasil neste forum, com seus respectivos clientes, e cada um tem uma realidade, eu por exemplo sou de Rondônia(longe em, hehe), e por aqui é dificil encontrar empresas, que não sejam do setor público, com grandes servidores dedicados e etc!!!

Considerando que um disco rígido que custa R$200,00 pode armazenar todas as fotos de todos os sites que já fiz na vida, qual a vantagem do banco de dados?

Considerando que um disco rígido que custa R$200,00 pode armazenar todas as fotos de todos os sites que já fiz na vida, qual a vantagem do banco de dados?[/quote]

Acho que vc não entendeu a ideia, estou falando da segurança e não do espaço em disco, vc sabe como é usuario, agora imagina uma maquina que não tem muitas restrições de acesso, com usuarios sem o que fazer mexendo nessas imagens!!!

[edited]
Eu mesmo estou desenvolvendo um sistema para Cartorios, onde serão guardadas as assinaturas scaneadas dos cliente, a maioria dos cartorios por aqui até tem uma maquina que eles “chamam” de servidor, mas que todo mundo tem acesso e pode ficar mexendo, bom neste caso optei pela gravação no BD, pela segurança dessas imagens!!!

Mas eu aceito seu método tambem, desde que no lugar apropriado, com servidores seguros e etc!!!

[quote=fredferrao]
Acho que vc não entendeu a ideia, estou falando da segurança e não do espaço em disco, vc sabe como é usuario, agora imagina uma maquina que não tem muitas restrições de acesso, com usuarios sem o que fazer mexendo nessas imagens!!![/quote]

Seu sistema operacional não permite remover direitos de uma pasta? Windows (Xp, 2000) e qualquer UNIX fazem isso.

Eu particularmente acho (isso mesmo… achismo meu :D) que em ambientes web é mais prático trabalhar com imagens no sistema de arquivos, porque o acesso ao mesmo geralmente é mais restrito.
Mas em aplicações desktop é mais complicado… eu prefiro guardar no banco. Nem sempre dá para garantir a política de acesso a um diretório… até porque em algumas empresas, a máquina onde se encontra o servidor de banco de dados é acessível aos usuários.
No meu caso, por exemplo, foi imposto trabalhar com imagens no banco, exatamento por isso… é uma aplicação desktop, e o dono da empresa QUER ter acesso total à máquina onde está o servidor do banco…
São casos de casos… o que posso fazer é ajudar (ou tentar pelo menos) com ambas as soluções… a decisão de qual delas usar fica por conta de cada um.

[]'s :thumbup:

O problema está na arquitetura, luiz. No seu exemplo desktop você tem uma aplicação Client/Server de duas camadas e o responsável pela persistêncai e quem implementa a camada de servidor é o banco de dados. Neste caso realmente não tem muito o que fazer.

Este tipo de aplicação não é mais comum, geralmente você vai ter um servidor de aplicações e este pode centralizar as requisições por imagens e armazená-las no disco ou em qualquer lugar.

Prefiro colocar as imagens no banco, mais simples fazer o backup. Mas pode ficar problemático o processamento de imagens muito grandes e/ou muitas imagens numa mesma página.

[reflexão]

pcalcado,

Será que esta é a realidade da maioria das empresas… usar um servidor de aplicação para aplicações desktop (swing)?
Pergunto isso porque ainda não tenho a experiência que você tem… não trabalhei em muitos projetos e também não conheço a realidade de muitas empresas…
Sei que esta é a solução mais adequada, mas será que é a mais usada?

[/reflexão]

[]'s

Eu particularmente em todos projetos que participei, até hoje não vi nenhum que me traria vantagem guardar imagem no BD.

Sim e não.

Swing de uma maneira geral é pouco utilizado (mas issoe stá relativamente mudando…) e quemf az Swing para aplicações desktop veio do Delphi/VB e está acostumado com C/S.

Aplicações feitas por pessoas experientes em java e/ou arquiteturas de sistema distribuídos dificilmente vão mantêr duas Camadas apenas. O Swing é só uma interface gráfica, ela não deve processar nada idealmente (ocasionalmente processa, até apra aproveitar o poder das máquinas atuais).