Gravando Arquivos Binários no PostgreSQL
Como inserir a imagem no banco?
Imagine um Banco com a seguinte estrutura:
Tabela arquivo:
- nome_foto (Campo String)
- foto_oid (Campo OID)
O raciocínio básico de como inserir uma imagem no banco de dados é bastante simples. Primeiro você tem que abrir uma conexão com o banco de dados, em seguida dizer à essa conexão que será criado um objeto nela. É nesse objeto que será inserido os dados binários do arquivo. Na tabela “arquivo” serão inseridos apenas o nome da foto como string e a referencia ao objeto, esta referencia nada mais é do que um número identificador que aponta para objeto.
O código PHP abaixo explica passo a passo.
Imagine um Banco com a seguinte estrutura:
Tabela arquivo:
- nome_foto (Campo String)
- foto_oid (Campo OID)
O raciocínio básico de como inserir uma imagem no banco de dados é bastante simples. Primeiro você tem que abrir uma conexão com o banco de dados, em seguida dizer à essa conexão que será criado um objeto nela. É nesse objeto que será inserido os dados binários do arquivo. Na tabela “arquivo” serão inseridos apenas o nome da foto como string e a referencia ao objeto, esta referencia nada mais é do que um número identificador que aponta para objeto.
O código PHP abaixo explica passo a passo.
<?php // Conectando ao Banco de Dados $conexao = pg_connect("host=localhost port=5432 user=postgres dbname=teste"); // Abrindo o arquivo em modo de leitura e carregando o // binário em uma variável, no Windows é necessário abrir // com o modo "rb" no linux só precisa do modo "r". $arquivo = fopen("imagem.jpeg","rb"); $dados = fread($arquivo,filesize("imagem.jpeg")); fclose($arquivo); // Note que será feita uma Transação ACID // (Atômica, Consistente, Isolada e Durável) com o banco, // ou seja, tudo ou nada. Uma transação inicia-se com uma // Query passando o comando BEGIN e finaliza-se com // um comando COMMIT. // Iniciando Transação com o banco pg_query($conexao, "BEGIN"); // Agora tem que dizer pra conexão aberta ($conexao) que // será criado um objeto nela e referenciado pra uma // variável chamada de $oid, ou seja, a variavel $oid // recebe apenas um numero que é o caminho para o // objeto. (Ex: $oid = 12345;) // Criando o Objeto na conexao $conexao. $oid = pg_lo_create($conexao); // O que será inserido no campo "foto" do banco não é o // binário do arquivo e sim a referencia para o objeto. // Imagine que o objeto foi criado na seção 12345 do // engenho interno. Só será salvo no campo apenas o // numero 12345 que referencia o objeto. // Inserindo referencia ($oid) do arquivo no banco. pg_query($conexao,"INSERT INTO arquivo (nome_foto,foto_oid) values('imagem.jpeg',$oid)"); // Agora o objeto tem que ser aberto com o modo de // escrita para poder ser inserido os dados binarios // do mesmo, que foi carregado usando-se um fread(). // Abrindo o objeto $objeto = pg_lo_open($conexao,$oid,"w"); // Inserindo Dados no arquivo pg_lo_write($objeto,$dados); // Fechando a conexao com o objeto pg_lo_close($objeto); // Finalizando Transação pg_query($conexao, "COMMIT"); ?>
Olá cara ! mto bom seu artigo !
Tipo, esse "$objeto" que você está fechando, onde você esta instanciando ele ?
see ya
Tipo, esse "$objeto" que você está fechando, onde você esta instanciando ele ?
see ya
05/06/2006 8:08am
(~18 anos atrás)
Poderia ainda utilizar o access do apache pra garantir segurança.
02/09/2005 1:09pm
(~19 anos atrás)
Guardar imagens realmente seria uma atitude ruim. BLOB CLOB costumam armazenar documentos do tipo "Microsoft Office" (word,powerpoint...)
Agora se o caso for guardar imagens, mais prático seria utilizar o banco para armazenar as pastas de cada usuário(não o conteúdo e sim o nome do folder) e utilizar o php para buscar e exibir as imagens desse folder.
Agora se o caso for guardar imagens, mais prático seria utilizar o banco para armazenar as pastas de cada usuário(não o conteúdo e sim o nome do folder) e utilizar o php para buscar e exibir as imagens desse folder.
02/09/2005 1:08pm
(~19 anos atrás)
é incrivel a facilidade de 'jogar' a imagem para o banco !!
porém utilizar essa estratégia para sites de fotos por exemplo é inviável ! será um puta de um processamento para visulizar essas fotos!
o servidor com certeza nao aguentara...outro problema é que o proprio banco fica pesado!
tive oportunidade de trabalhar num site desse estilo e tinhamos Gigabytes de imagem (em disco), eram milhares de albuns e fotos! imagine essas imagens todas em BD!
apenas em poucos casos é interessante guardar imagens no banco!
e outra, o servidor Linux com Apache tem muitos recursos de segurança que 'garatem' o acesso restrito a tais imagens em disco!
;)
porém utilizar essa estratégia para sites de fotos por exemplo é inviável ! será um puta de um processamento para visulizar essas fotos!
o servidor com certeza nao aguentara...outro problema é que o proprio banco fica pesado!
tive oportunidade de trabalhar num site desse estilo e tinhamos Gigabytes de imagem (em disco), eram milhares de albuns e fotos! imagine essas imagens todas em BD!
apenas em poucos casos é interessante guardar imagens no banco!
e outra, o servidor Linux com Apache tem muitos recursos de segurança que 'garatem' o acesso restrito a tais imagens em disco!
;)
29/08/2005 7:03pm
(~19 anos atrás)
no entando na hora de visualizar a imagem está aparecendo bugada.
O que pode ser ?
see ya !