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.
...InputStreaminput=resultSet.getBinaryStream("mgm_imagem");if(input!=null){ByteArrayOutputStreamoutput=newByteArrayOutputStream();// set read buffer sizebyte[]rb=newbyte[1024];intch=0;while((ch=input.read(rb))!=-1){output.write(rb,0,ch);}// transfer to byte bufferbyte[]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:
andre_guitar7
Pra uma aplicação Web… o que é melhor? Guardar em banco ou numa pasta separada?
vlw!
pcalcado
Não guarde as fotos, salve-as em disco e apenas coloque o nome do arquivo no registro do SGBD.
andre_guitar7
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…
Luiz_Gustavo
também concoro com essa abordagem… mas quando nos é imposto o “como fazer”… precisamos fazer
e quando você precisa de mais de uma imagem para um usuário/peça/algo_que_precise_de_foto?
Luiz-SP
Luiz_Gustavo:
pcalcado:
Não guarde as fotos, salve-as em disco e apenas coloque o nome do arquivo no registro do SGBD.
também concoro com essa abordagem… mas quando nos é imposto o “como fazer”… precisamos fazer
e quando você precisa de mais de uma imagem para um usuário/peça/algo_que_precise_de_foto?
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
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!!!
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!!!
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.
fredferrao
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!!!
pcalcado
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?
fredferrao
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?
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!!!
pcalcado
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!!!
Seu sistema operacional não permite remover direitos de uma pasta? Windows (Xp, 2000) e qualquer UNIX fazem isso.
Luiz_Gustavo
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:
pcalcado
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.
_fs
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.
Luiz_Gustavo
[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
Rafael_Nunes
Eu particularmente em todos projetos que participei, até hoje não vi nenhum que me traria vantagem guardar imagem no BD.
pcalcado
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).
L
LeandroSeverino
Pessoal,
Particularmente sempre utilizei o salvamento das imagens em disco.
A questão do facilidade de fazer backup que o colega mencionou é facilmente resolvida pela realização do backup na pasta onde estão as imagens, inclusive acredito que essas imagens no banco tendem a deixar o backup do banco bem maior e bem mais demorado também.
Essa questão é bastente polêmica, inclusive já conversei com vários DBAs e todos são a favor de um banco de dados mais enxuto, pois quanto maior a tabela, mais demorado o acesso a ela (Até rimou, heheheh).
Essa é minha opnião, mas sempre disposto à discussão.
_fs
… e ainda insistem em best practices hehe
Depende do caso, simples assim Em um deles as imagens eram apenas fotos 3x4 com menos de 5kbs. Para que o trabalho de backups de diretórios se podia evitar?
Usar “mais lento” e “mais rápido” sem apoio de tabelas e gráficos é bobeira [uma que me pego fazendo várias vezes].
Luiz_Gustavo
pcalcado:
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).
[querendo_aprender]
duas observações:
Quando você diz que Swing é pouco usado por programadores Java, e sim por programadores oriundos de outras linguagens, me dá a impressão de que swing é um pouco marginalizado… e que esses muitos programadores Java dão preferência a outras abordagens (cliente Web) em sistemas desktop quando poderiam usar swing.
O fato de usar ou não swing, é claro, é dependente da necessidade - muitas vezes interfaces baseadas em html, xml, etc. resolvem o problema - mas também é possível utilizar GUI’s Swing e fazer a comunicação via http com servlets em um ambiente local (intranet, por exemplo), certo?
Não estou querendo com isso promover Swing … mas vejo que em uma situação em que as duas abordagens são igualmente aplicáveis, swing é a última opção da maioria…
Por quê isso ocorre? É pelo fato de Swing ser - segundo alguns - mais complicado?
Outro ponto que me fez refletir… quando você fala em camadas, está falando de camadas físicas, certo?
Por exemplo: ao citar que swing não deve processar nada, você quer dizer que a camada lógica de apresentação não deve ter código com regras de negócio, é isso mesmo?
Exemplo: Nesse esquema de C/S, eu cotumo criar uma classe para apresentação (UI), outra para processar regras de negócio, outra para fazer a persistência dos objetos… a UI em swing não processa regras de negócio…enfim, separo em camadas lógicas (bem, eu acredito que seja isso mesmo).
A questão é que tudo isso fica em um único arquivo .jar, na parte cliente do esquema C/S.
Ou seja… nem sempre em um esquema C/S, Swing vai estar (efetivamente) processando regras de negócio… ou considera-se que está, por estar tudo dentro de um único .jar?
Em arquiteturas distribuídas essas camadas lógicas costuma ficar separadas em camadas físicas também, certo?
[/querendo_aprender]
[]'s
pcalcado
Oi,
Uma interface Swing é (para a maioria, pelo menos) mais complexa que uma interface web. Geralmente dispomos de linguagens específicas apra interfaces Web, seja HTMl, Flash ou algo do tipo, em Swing temos que usar java.
Java é uma ótima linguagem mas não é a melhor apra tudo e eu pessoalmente acredito que para descrever interfaces é péssima.
Construir uma interface web então acaba sendo mais rápido, simples e produtivo. Sempre é assim? Não. Muitas vezes precisamos de algo que HTML e/ou Flash não suporta. Quem tem aversão á Swing acaba fazendo mil e uma gambiarras para driblar as limitações.
Sim, como dito, mas usar HTTP para comunicar Java com Java geralmente é uma complexidade desnecessária, RMI pode ser uma opção bem melhor.
Neste contexto sim, tiers.
No Mundo Perfeito™, código Swing (JFrame, JButton, Listener, blablabla) não deve processar nenhuma regra de negócio, deve delegar para a Camada Lógica (Layer) de Negócio que pode estar na mesma Camada Física(Tier) ou não, tanto faz.
Ok.
Como falei acima não, empacotamento (quantos Jars, wars, ear você tem) não diz sobre Camadas, apesar de uma organização neste ajudar muito na coesão do sistema e reduzir dependências.
Não necessariamente. Você pode ter tudo na mesma Camada, cada uma em uma Camada, várias em uma… a organização que fizer mais sentido.
Com 2 Camadas Físicas apenas você tem um problema porque sua regra d enegócio está replicada em todos os clientes. O ideal é que você mantenha o que é comum centralizado e o que é específico na máquina do cliente.
As regras de negócio são comuns á todos, por exemplo, mas o estado da interface é específico de cada usuário. A solução é isolar a regra de negócio numa Camada Física que é acessada pelso usuários que possuem a Camada Lógica de Apresentação implementada como uma aplicação Swing.
Luiz_Gustavo
Muito obrigado !!!
:thumbup:
lsouzabr
Pessoal, seguinte…
Eu particularmente prefiro salvar somente o endereço do arquivo no banco de dados.
Porém é o seguinte, somente foi demonstrado aqui como salvar o arquivo no banco, esqueceram de exlicar o procedimento pra armazenar somente o endereço do arquivo.
Se alguém puder me mostrar o caminho, ficarei muito agradecido.
D
Dan_Rodrigues
todo mundo falou falou, mas ninguém respondeu a pergunta do sujeito.
boas!!! a minha duvida e identica, Pois eu tambem acho que se deve copiar tudo para um directorio na pasta do exe, indentifica-lo da forma que quisermos e guardar o caminho, mas o meu problema e que estou a usar o copyfile, mas o programa nao copia, sera que me podem postar um exemplo de um programa que funcione com o copyfile?
Agradeço que me ajudem se faz favor.
Jefries
Galera desculpa atrapalhar a discussão de vocês…
auuhuhuhauahuahuhuahuhauhauhahuhauauhauah
Mas eu quero fazer uma pergunta.
Viu, como eu pego de uma foto através de FileChooser, e em seguida coloco em um panel com o título “foto do aluno”, dai clico em um botão gravar, dai sim grava essa imagem no banco de dados???/