Conteúdo abordado no tutorial: PHP e MySQL
Você já se perguntou “Como armazeno arquivos no banco de dados ao invés de armazenar um endereço de localização?”. A resposta é bem simples, basta usar o tipo BLOB (Binary Large Objects) no campo de sua tabela. Campos do tipo BLOB podem armazenar praticamente qualquer tipo de dados, desde um arquivo .txt até um arquivo .mp3.
Quando um arquivo é armazenado no banco de dados usando um campo do tipo BLOB, ele é convertido para binário, não podendo ser alterado diretamente no banco, a não ser que seja enviado novamente.
Em se tratando de MySQL, existem quantro variações do tipo BLOB, cada uma com sua limitação de armazenamento, conforme mostrado abaixo:
tinyblob = tamanho máximo de 255 caracteres
blob = tamanho máximo de 65535 caracteres
mediumblob = tamanho máximo de 16777215 caracteres
longblob = tamanho máximo de 4294967295 caracteres
Para este tutorial iremos utilizar o tipo “mediumblob”, mas você deve escolher aquele que se adequa melhor à sua necessidade.
Para começar a trabalhar, vamos criar o banco de dados, que se chamará ‘tutorial_manipblob_db”. Você pode criar usando o phpmyadmin ou qualquer outro SGBD de sua escolha.
Após criar o banco de dados, vamos criar a tabela que se chamará “arquivos”. Para isso, basta rodar a instrução SQL a seguir:
CREATE TABLE arquivos( id int not null auto_increment primary key, nome varchar(50), titulo varchar(50), conteudo mediumblob, tipo varchar(50) );
Com estrutura de banco de dados para armazenamento das informações criada, chegou a hora de começar a escrever um pouco de código e fazer tudo funcionar.
Serão criado 4 arquivos:
index.php – formulário para envio do arquivo
gravar.php – gravará o arquivo no banco de dados
listar.php – listará os registros armazenados no banco de dados
baixar.php – fará o download do arquivo, ou abrirá o mesmo no browser
Criando o arquivo index.php
Nesse arquivo está o código html do formulário responsável por enviar o arquivo para o servidor, para que seja armazenado no banco de dados.
<html>
<head>
<title>Armazenado arquivos no banco de dados</title>
<head>
<body>
<form enctype="multipart/form-data" action="gravar.php" method="post">
<label>Descrição</label>
<input type="text" name="titulo" size="30">
<label>Arquivo</label>
<input type="file" name="arquivo">
<input type="submit" value="Enviar arquivo">
</form>
</body>
</html>
Importante!
Sempre que um formulário for fazer envio de arquivos, ele precisa ter a propriedade “enctype” setada como “multipart/form-data”, senão o arquivo não será enviado.
Criando o arquivo gravar.php
Esse é o responsável por fazer a gravação dos dados do arquivo e do próprio arquivo no banco de dados.
<?php //Faz a conexão com o banco de dados (troque usuário e senha pelos dados de acesso ao seu banco de dados) $conn = mysql_connect("localhost","usuario","senha"); mysql_select_db("tutorial_manipblob_db"); //Extrai as informações do arquivo para serem armazenadas em seus respectivos campos na tabela do banco de dados $arquiivo = $_FILES['arquivo']['tmp_name']; $tamanho = $_FILES['arquivo']['size']; $tipo = $_FILES['arquivo']['type']; $nome = $_FILES['arquivo']['name']; $titulo = $_POST['titulo']; //Verifica se foi enviado algum arquivo através do formulário if ($arquivo != "none"){ //Abre o arquivo enviado como somente leitura $fp = fopen($arquivo, "rb"); //lê o conteúdo do arquivo e o armazena em uma variável $conteudo = fread($fp, $tamanho); //insere uma \ antes de ', " e / $conteudo = addslashes($conteudo); //fecha o arquivo fclose($fp); //Instrução SQL para inserir os dados do arquivo e o próprio arquivo no banco de dados $qry = "INSERT INTO arquivos VALUES (0,'".$nome."','".$titulo."','".$conteudo."','".$tipo."')"; //Executa a instrução criada na linha acima mysql_query($qry); //Verifica se os dados foram armazenados no banco de dados if(mysql_affected_rows($conn) > 0){ //Se foram, então informa sobre a gravação e exibe um link para a lista com os dados armazenados no banco de dados echo "O arquivo foi gravado na base de dados.<br/><br/>"; echo "<a href=\"listar.php\">Veja os arquivos armazenados clicando aqui.</a>"; }else //Se não foi feita a gravação, então informa que não foi possível gravar echo "Não foi possível gravar o arquivo."; }else //Se não foi enviado nenhum arquivo pelo formulário, então informa ao usuário echo "Não foi possível carregar o arquivo."; ?>
Criando o arquivo listar.php
Esse arquivo irá exibir uma lista com as informações de cada registro do banco de dados e um link para o download do arquivo.
<?php //Conexão com o banco de dados $conn = mysql_connect("localhost","root",""); mysql_select_db("tutorial_manipblob_db"); //Instrução SQL para trazer todos os registros armazenados no banco de dados $qry = "SELECT id, nome, titulo, tipo FROM arquivos"; //Executa a instrução criada na linha acima $res = mysql_query($qry); //A execução da instrução SQL retornará um array, então será feito um loop por ele //para listar cada um dos registros retornados while($fila = mysql_fetch_array($res)){ //imprime na tela os dados do registro incluindo um link que aponta para o arquivo baixar.php //e uma variável id, que contém o código do registro no banco de dados, para que possa ser recuperado e baixado echo $fila['titulo']."<br/>".$fila['nome']."(".$fila['tipo'].")<br/><a href=\"baixar.php?id=".$fila['id']."\">Fazer Download</a><br/><br/>"; } ?>
Criando o arquivo baixar.php
O arquivo baixar.php é o responsável pelo download do arquivo armazenado no banco de dados. Conforme o tipo de arquivo armazeado, ele poderá ser aberto no próprio browser ou então aberta uma tela para salvar o arquivo em disco.
<?php //Faz a conexão com o banco de dados $conn = mysql_connect("localhost","root",""); mysql_select_db("tutorial_manipblob_db"); //Instrução SQL que irá recuperar o arquivo selecionado $qry = "SELECT tipo, conteudo FROM arquivos WHERE id=".$_REQUEST['id']; //Executa a instrução SQL criada na linha acima $res = mysql_query($qry); //Passa à variável $tipo o tipo do arquivo $tipo = mysql_result($res, 0, "tipo"); //Passa à variável $conteudo o conteúdo, o arquivo propriamente dito $conteudo = mysql_result($res, 0, "conteudo"); //Adiciona o cabeçalho para o tipo de arquivo armazenado, //para que o browser possa interpretá-lo corretamente header("Content-type: $tipo"); //Imprime na tela o conteúdo do arquivo ou abre uma tela para gravar em disco. echo $conteudo; ?>
Com isso foi criado um simples sistema para armazenamento de arquivos em banco de dados, usando PHP, MySQL e o tipo de dados BLOB.
Clique aqui e faça o download dos fontes para estudo.
Em caso de dúvidas, esclarecimentos, sugestões ou elogios, deixe nos comentários, que responderei o mais breve possível.

