-2

Gravando Arquivos Binários no PostgreSQL

criado por Eduardo Lundgren (braeker) em 21/08/2005 8:31pm
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.

<?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");
?>

Comentários:

Mostrando 1 - 5 de 5 comentários
E outra coisa, a cópia do arquivo ta rolando
no entando na hora de visualizar a imagem está aparecendo bugada.

O que pode ser ?

see ya !
05/06/2006 8:09am (~16 anos atrás)

Olá cara ! mto bom seu artigo !

Tipo, esse "$objeto" que você está fechando, onde você esta instanciando ele ?

see ya
05/06/2006 8:08am (~16 anos atrás)

Rui disse:
Poderia ainda utilizar o access do apache pra garantir segurança.
02/09/2005 1:09pm (~17 anos atrás)

Rui disse:
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.
02/09/2005 1:08pm (~17 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!

;)
29/08/2005 7:03pm (~17 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)