Armazenando Arquivos Binários no MySQL
O Problema
Durante o desenvolvimento de um aplicativo para controle de livros de uma Biblioteca utilizando PHP e MySQL, eu me deparei com a necessidade de armazenar arquivos (imagens, binários, sons etc) em meu banco de dados MySQL.
A Solução
Sabemos que em 1 byte podemos representar até 256 números (0 à 255).Esse intervalo numérico é suficiente para representar todos os caracteres.
O MySQL oferece o tipo de dados LONGBLOB que pode armazenar até 4,2 GB de informação em formato de string (sequência de caracteres). Isto equivale à 4.509.715.660,8 caracteres.
Eureka! Por que então lermos os bytes (números), como caracteres e armazenamos essa sequência de bytes como uma sequência de caracteres (string) em um campo do tipo LONGBLOB? Pois foi exatamente isso que fiz.
Uma Segunda Solução
Poderíamos ao invés de armazenarmos o arquivo em sí no banco de dados, armazenarmos o caminho que leva à esse arquivo no sistema de arquivos da máquina. Mas por questões de segurança essa solução não é tão viável como a primeira.
O Banco de Dados
Primeiro vamos criar a estrutura no Banco de dados para receber os arquivos. Execute o comando CREATE DATABASE Arquivobd;
Com isso terá criado o banco de dados chamado Arquivobd. Agora execute o comando:
Com isso terá criado a tabela arquivos com os campos: nome, tipo, tamanho e dados.
O Programa
O programa exemplificará como armazenar um arquivo qualquer no Banco de dados e como recuperá-lo.
Arquivos:
config.inc - Contém as configuração específicas de cada sistema para que o programa funcione. Você deve alterar os valores das variáveis de acordo com seu sistema.
principal.php - Contém o formulário e um pequeno script para visualizar os arquivos armazenados atualmente no banco de dados.
dados.php - Recebe, trata e remete as informações do arquivo principal.php para o Banco de dados
copiar.php - É chamado pelo script php do arquivo principal.php, e tem a finalidade de recuperar o arquivo e fornecê-lo para download.
Durante o desenvolvimento de um aplicativo para controle de livros de uma Biblioteca utilizando PHP e MySQL, eu me deparei com a necessidade de armazenar arquivos (imagens, binários, sons etc) em meu banco de dados MySQL.
A Solução
Sabemos que em 1 byte podemos representar até 256 números (0 à 255).Esse intervalo numérico é suficiente para representar todos os caracteres.
O MySQL oferece o tipo de dados LONGBLOB que pode armazenar até 4,2 GB de informação em formato de string (sequência de caracteres). Isto equivale à 4.509.715.660,8 caracteres.
Eureka! Por que então lermos os bytes (números), como caracteres e armazenamos essa sequência de bytes como uma sequência de caracteres (string) em um campo do tipo LONGBLOB? Pois foi exatamente isso que fiz.
Uma Segunda Solução
Poderíamos ao invés de armazenarmos o arquivo em sí no banco de dados, armazenarmos o caminho que leva à esse arquivo no sistema de arquivos da máquina. Mas por questões de segurança essa solução não é tão viável como a primeira.
O Banco de Dados
Primeiro vamos criar a estrutura no Banco de dados para receber os arquivos. Execute o comando CREATE DATABASE Arquivobd;
Com isso terá criado o banco de dados chamado Arquivobd. Agora execute o comando:
CREATE TABLE arquivos ( nome varchar(30) NOT NULL, tipo varchar(30) NOT NULL, tamanho varchar(30) NOT NULL, dados longblob NOT NULL, PRIMARY KEY (nome) );
Com isso terá criado a tabela arquivos com os campos: nome, tipo, tamanho e dados.
O Programa
O programa exemplificará como armazenar um arquivo qualquer no Banco de dados e como recuperá-lo.
Arquivos:
config.inc - Contém as configuração específicas de cada sistema para que o programa funcione. Você deve alterar os valores das variáveis de acordo com seu sistema.
principal.php - Contém o formulário e um pequeno script para visualizar os arquivos armazenados atualmente no banco de dados.
dados.php - Recebe, trata e remete as informações do arquivo principal.php para o Banco de dados
copiar.php - É chamado pelo script php do arquivo principal.php, e tem a finalidade de recuperar o arquivo e fornecê-lo para download.
NAo entendo muito de php e mysql, mas creio que segui os passo direitin, o que acontece é que quando vai mostrar a imagem, só mostra os hexadecimais dela e nao a imagem propriamente dita, o que será que está acontecendo
QUero que mostre as imagens nao os hexadecimais dela..
Obrigado
QUero que mostre as imagens nao os hexadecimais dela..
Obrigado
19/08/2006 7:30am
(~18 anos atrás)
Caro Roberto,
Eu utilizo o mesmo esquema de armazenamento de informação do bruno, porem deve-se renomear esse arquivo .ini para .php, assim, teóricamente, ninguém conseguirá acessar suas informações do BD.
Att
Thiago Teixeira
Eu utilizo o mesmo esquema de armazenamento de informação do bruno, porem deve-se renomear esse arquivo .ini para .php, assim, teóricamente, ninguém conseguirá acessar suas informações do BD.
Att
Thiago Teixeira
22/05/2006 5:56am
(~18 anos atrás)
estou usando o (Armazenando Arquivos Binários no MySQL) para armazenar imagem, como faço para abrir as fotos dendro do site. e para um pagina de noticias eu quero inserir o texto com a imagem que esta la! grato
07/04/2006 12:59pm
(~18 anos atrás)
Olá Bruno, dei uma olhada no seu artigo publicado no PHPBrasil ! muito bom ! No entanto tenho um problema. O processo de inserir o registro esta normal, mas quanto faço uma solicitação para baixar o arquivo, é mostrado naquela tela de download o Nome do Arquivo : Tipo do Arquivo, mas o Tamanho vem zerado, ou seja, quando faço o download, o arquivo vem com tamanho Zero .
Sabe porque acontece isso ?
Valeu
Sabe porque acontece isso ?
Valeu
17/03/2006 5:03am
(~18 anos atrás)
Estou tendo esse erro, na hora que clico no nome do arquivo para baixar:
Warning: Cannot modify header information - headers already sent by (output started at /home/rgarber/www/noticias/blob/copiar.php:6) in /home/rgarber/www/noticias/blob/copiar.php on line 19
Warning: Cannot modify header information - headers already sent by (output started at /home/rgarber/www/noticias/blob/copiar.php:6) in /home/rgarber/www/noticias/blob/copiar.php on line 20
Warning: Cannot modify header information - headers already sent by (output started at /home/rgarber/www/noticias/blob/copiar.php:6) in /home/rgarber/www/noticias/blob/copiar.php on line 21
Warning: Cannot modify header information - headers already sent by (output started at /home/rgarber/www/noticias/blob/copiar.php:6) in /home/rgarber/www/noticias/blob/copiar.php on line 22
GIF89aÔ<æ¾Ìݘ·gPm[;MC333¬µ½Zq–ÎÝä!M?¤¯µ !o:)‹p8ßæ槪¡]PF»ÆÊ„ŠŒ™™™Yl†MTn4:<ÄxPÝæïROD7^’¬Ìt¼Ìç’?~µ½¼MJ!ÿ NETSCAPE2.0!ù,ÿ,Ô<ÿ€ ‚ƒ„…†‡ˆ‰Š‹Œ?Ž?? D“”•–—˜™š›œ?žŸ ¡¢—I¥¦§¨¥™©®22]²³´µ¶´°°s»®¾dÁÂd<ÅÆÇÈÅ¿¾vÍvËÀÃYÓÇÁλs®®Îv®Ø»±³¹®©I‘çèéêë샣ïœíŠðñò‹•å¨Ÿù¥¯á·»ä(#[/h¿†%[¸p˜CaÓ"JÌÌ7n¦.:ÓömN3SD’‰B‡ƒJ†Ä§…/ƒø¤
......
.....
.....
.....
.....
.....
Como posso resolver isso??
Warning: Cannot modify header information - headers already sent by (output started at /home/rgarber/www/noticias/blob/copiar.php:6) in /home/rgarber/www/noticias/blob/copiar.php on line 19
Warning: Cannot modify header information - headers already sent by (output started at /home/rgarber/www/noticias/blob/copiar.php:6) in /home/rgarber/www/noticias/blob/copiar.php on line 20
Warning: Cannot modify header information - headers already sent by (output started at /home/rgarber/www/noticias/blob/copiar.php:6) in /home/rgarber/www/noticias/blob/copiar.php on line 21
Warning: Cannot modify header information - headers already sent by (output started at /home/rgarber/www/noticias/blob/copiar.php:6) in /home/rgarber/www/noticias/blob/copiar.php on line 22
GIF89aÔ<æ¾Ìݘ·gPm[;MC333¬µ½Zq–ÎÝä!M?¤¯µ !o:)‹p8ßæ槪¡]PF»ÆÊ„ŠŒ™™™Yl†MTn4:<ÄxPÝæïROD7^’¬Ìt¼Ìç’?~µ½¼MJ!ÿ NETSCAPE2.0!ù,ÿ,Ô<ÿ€ ‚ƒ„…†‡ˆ‰Š‹Œ?Ž?? D“”•–—˜™š›œ?žŸ ¡¢—I¥¦§¨¥™©®22]²³´µ¶´°°s»®¾dÁÂd<ÅÆÇÈÅ¿¾vÍvËÀÃYÓÇÁλs®®Îv®Ø»±³¹®©I‘çèéêë샣ïœíŠðñò‹•å¨Ÿù¥¯á·»ä(#[/h¿†%[¸p˜CaÓ"JÌÌ7n¦.:ÓömN3SD’‰B‡ƒJ†Ä§…/ƒø¤
......
.....
.....
.....
.....
.....
Como posso resolver isso??
14/09/2005 3:21pm
(~19 anos atrás)
como faço para mostrar a imagem <img scr> direto do banco sem ter que copiar para o hd
17/08/2005 8:28am
(~19 anos atrás)
Estou passando extamente por este problema.
Só que ao invés de colocar um link quero apenas exibir a foto.
Tentei usar object e img mas não consigo.
Alguém sabe como fazer isso?