+4

Armazenando Arquivos Binários no MySQL

criado por Bruno Rodrigues Silva em 11/04/2002 11:52am
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:

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.

Comentários:

Mostrando 1 - 10 de 34 comentários
Alguém consegue me ajudar?
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?
16/07/2008 3:45pm (~8 anos atrás)

fccd disse:
Grande utilidade esse artigo!

Valeu!
10/01/2008 11:10am (~9 anos atrás)

Andre Lamota disse:
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
19/08/2006 7:30am (~10 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
22/05/2006 5:56am (~10 anos atrás)

CARLOS disse:
kkk
07/04/2006 2:10pm (~10 anos atrás)

CARLOS disse:
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 (~10 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
17/03/2006 5:03am (~10 anos atrás)

E no PostGreSQL, como ficaria ? Qual o tipo de dado ?
29/09/2005 8:01am (~11 anos atrás)

Dartanhan disse:
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??
14/09/2005 3:21pm (~11 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 (~11 anos atrás)

Novo Comentário:

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