Cadastro de imagens e outros arquivos usando o campo BLOB do MySQL

Estou disponibilizando para download um aplicação web muito simples para manipular campos Blob do MySQL.

O que é um campo do tipo Blob?

Um blob (do inglês: Binary Large OBject, basic large object, representa um conjunto de dados binários armazenados em um único campo de uma tabela. O uso mais apropriado para o campo blob é para armazenamento multimídia como imagens, videos e áudio, porém, seu uso não limita apenas a isto.

O MySQL oferece 4 tipos de campos Blob sendo eles;

TINYBLOBConsegue armazenar apenas 255 Bytes de dados, equivale a pequenos arquivos de textos e chaves criptográficas.
BLOBConsegue armazenar até 64 KB de dados, equivale a uma pequena imagem, um ícone.
MEDIUMBLOBConsegue armazenar até 16MB de dados, equivale a uma fotografia normal ou um arquivo de áudio MP3 de boa qualidade.
LONGBLOBArmazena até 4GB de dados.

 

E se eu precisar gravar mais do que 4Gb em um campo Blob?

Neste caso, o MySQL não resolve a sua necessidade. Você deverá partir para outros tipos de bancos como Oracle ou MS SQL.

Aplicação PHP para cadastro de arquivos

Download dos scripts PHP para gravar arquivos em campos blob.

Veja um screenshot da aplicação PHP em execução:

Estrutura do Banco de dados (bd_multimedia.sql )

Você encontrará o arquivo bd_multimedia.sql basta importá-lo para seu servidor. O banco possui uma única tabela seguindo a seguinte estrutura;

INSERT no campo BLOB (index.php)

O arquivo index.php contêm o script que executa o comando INSERT na tabela tb_arquivos.

O script de inserção necessita de um formulário que suporte a codificação de dados, ou seja, iremos codificar os dados em binários. Isso pode ser feito usando o atributo enctype=”multipart/form-data” na tag <FORM> conforme mostra a primeira linha do código;

<form enctype="multipart/form-data" method="post">
  <label>Arquivo</label>
  <input type="file" name="arquivo" class="form-control" required>

  <label>Descrição</label>
  <input type="text" name="titulo" size="30" class="form-control" required>

  <button type="submit" class="btn">Enviar arquivo</button>
</form>

Para fazer a inserção o script PHP necessita de um submit do tipo POST. O script faz a leitura do vetor $_FILES separando os dados do arquivo. O Script utiliza uma conexão PDO para se conectar ao banco.

<?php
 if ($_POST) {
   include("./core/dadosconexao.php");
   $arquivo = $_FILES["arquivo"]["tmp_name"];
   $tamanho = $_FILES["arquivo"]["size"];
   $tipo = $_FILES["arquivo"]["type"];
   $nome = $_FILES["arquivo"]["name"];
   $titulo = $_POST["titulo"];

  if ( $arquivo != "none" )
  {
    $fp = fopen($arquivo, "rb");
    $conteudo = fread($fp, $tamanho);
    $conteudo = addslashes($conteudo);
    fclose($fp);

    try {
      $conecta = new PDO("mysql:host=$servidor;dbname=$banco", $usuario , $senha); //istancia a classe PDO
	  $conecta->exec("set names utf8"); //permite caracteres latinos.
      $comandoSQL = "INSERT INTO tb_arquivos VALUES (0,'$nome','$titulo','$conteudo','$tipo')";
      $grava = $conecta->prepare($comandoSQL); //testa o comando SQL
      $grava->execute(array()); 
      echo '<br/><div class="alert alert-success" role="alert">
            Arquivo enviado com sucesso para o servidor!
            </div>';
 } catch(PDOException $e) { // caso retorne erro
     echo '<br/><div class="alert alert-error" role="alert">
           Erro ' . $e->getMessage() .
          '</div>';}
 }}
 ?>

OBS: O arquivo core/dadosconexao.php guarda os dados de conexão com o servidor e o banco.

Consultar e listar arquivos do tipo BLOB (lista-de-arquivos.php)

Outro arquivo legal desta aplicação PHP é o lista-de-arquivos.php que cria uma tabela baseada em uma consulta ao banco de dados, novamente usando PDO.

<?php
 include("./core/dadosconexao.php");
 try
 {
   $conecta = new PDO("mysql:host=$servidor;dbname=$banco", $usuario , $senha);
   $conecta->exec("set names utf8"); //permite caracteres latinos.
   $consultaSQL = "SELECT arquivo_id, arquivo_nome, arquivo_titulo, arquivo_tipo FROM tb_arquivos";
   $exComando = $conecta->prepare($consultaSQL); //testar o comando
   $exComando->execute(array());
 
   echo("
        <table class='table table-striped table-bordered table-hover'>
        <thead class='thead-dark'>
        <tr>
        <th>ID</th>
        <th>Nome</th>
        <th>Titulo</th>
        <th>Tipo</th>
        <th>Abrir</th>
        <th>Thumbnail</th>
        </tr>
        </thead>
        ");

 foreach($exComando as $resultado)
 {
   echo ("
         <tr>
         <td>$resultado[arquivo_id]</td>
         <td>$resultado[arquivo_nome]</td>
         <td>$resultado[arquivo_titulo]</td>
         <td>$resultado[arquivo_tipo]</td>
         <td><a href='abrir_arquivo.php?id=$resultado[arquivo_id]'>abrir</a></td>
         <td><img src='abrir_arquivo.php?id=$resultado[arquivo_id]' width='120px'/></td>
         </tr>
       ");
 } 
 echo("</table>");
 
}catch(PDOException $erro)
 {
    echo("Errrooooo! foi esse: " . $erro->getMessage());
 } ?>

Abrir e exibir valores de campo BLOB, imagens e outros arquivos (abrir-arquivo.php)

O arquivo abrir-arquivo.php permite exibir e fazer download do arquivo. Lembrando que dados BLOB são codificados em binário e precisamos fazer a decodificação para enfim exibir para o usuário.

Esta decodificação é feita logo no carregamento da página usando a função header do PHP. Para que a decodificação não gere erros no arquivo é importante saber o tipo de arquivo que será decodificado, se é uma imagem, um vídeo, um arquivo texto, etc…

Neste código, a linha mais importante é a header(“Content-Type: $tipo”);

<?php
 include("./core/dadosconexao.php");
 try
 {
   $conecta = new PDO("mysql:host=$servidor;dbname=$banco", $usuario , $senha);
   $conecta->exec("set names utf8"); //permite caracteres latinos.
   $consultaSQL = "SELECT arquivo_tipo, arquivo_conteudo FROM tb_arquivos WHERE arquivo_id=$_GET[id]";
   $exComando = $conecta->prepare($consultaSQL); //testar o comando
   $exComando->execute(array());
   foreach($exComando as $resultado)
   {
     $tipo = $resultado['arquivo_tipo'];
     $conteudo = $resultado['arquivo_conteudo'];
     header("Content-Type: $tipo");
     echo $conteudo;
   } 
  }catch(PDOException $erro)
   {
     echo("Errrooooo! foi esse: " . $erro->getMessage());
   } ?>

É isso aí, bons estudos!

blob com PHPexibir conteúdo blobgravar arquivos no banco de dadosgravar arquivos no MySQLgravar campo blobgravar imagens no banco de dadosgravar imagens no MySQLmysql blobscript php blobupload para o banco de dadosupload para o MySQL