Olá pessoal, neste artigo vou mostrar como armazenar arquivos em modo binário no MySQL usando o PHP, e como recuperar estes arquivos para usá-los depois.
No banco de dados(MySQL) usaremos o campo do tipo BLOB é utilizado para armazenar arquivos binários e são dividivo em 4 tipos; TINYBLOB, BLOB, MEDIUMBLOB e LONGBLOB, a diferença é a capacidade de armazenar os dados.
Lembrando que podemos usar colunas do tipo TEXT para armazenar informações binarias também, abaixo a comparação.
-TINYBLOB, TINYTEXT – tamanho máximo de 255 – 256 Bytes
-BLOB, TEXT – tamanho máximo de 65535 – 64KB
-MEDIUMBLOB, MEDIUMTEXT – tamanho máximo de 16777215 – 16 MB
-LONGBLOB, LONGTEXT – tamanho máximo de 4294967295 – 4 GB
Observação:
-Na maioria dos servidores de hospedagem compartilhada o tipo LONGBLOB é configurada para suportar entre 50MB a 200 MB para manter o bom funcionamento do servidor.
-E que você deve analisar a real necessidade de armazenar o arquivo dentro do banco, pois isto faria sua base ficar gigante, e na maioria dos casos é gravado somente a URL(caminho do arquivo) no banco.
você poderá ler mais sobre especificaçõe de colunas do MySQL no link:
http://dev.mysql.com/doc/refman/4.1/pt/column-types.html
1° – Passo
O primeiro passo é criarmos o banco de dados e a tabela para armazenar nossos arquivos;
no exemplo o banco será chamado binario
Agora crie uma tabela com o nome arquivos seguindo a estrutura abaixo;
CREATE TABLE `binario`.`arquivos` (
`Codigo` INT( 10 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'Codigo',
`NmArquivo` VARCHAR( 150 ) NOT NULL COMMENT 'nome original',
`Descricao` VARCHAR( 200 ) NULL COMMENT 'descrição do arquivo',
`Arquivo` MEDIUMBLOB NOT NULL COMMENT 'dados do arquivo',
`Tipo` VARCHAR( 15 ) NOT NULL COMMENT 'Tipo do arquivo, jpeg, doc, mp3, etc..',
`Tamanho` INT NOT NULL COMMENT 'Tamanho em bytes',
`DtHrEnvio` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Data e Hora de envio'
) ENGINE = MYISAM ;
/*
Claro que você deve implementar a tabela conforme a necessidade do seu projeto.
*/ |
CREATE TABLE `binario`.`arquivos` (
`Codigo` INT( 10 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'Codigo',
`NmArquivo` VARCHAR( 150 ) NOT NULL COMMENT 'nome original',
`Descricao` VARCHAR( 200 ) NULL COMMENT 'descrição do arquivo',
`Arquivo` MEDIUMBLOB NOT NULL COMMENT 'dados do arquivo',
`Tipo` VARCHAR( 15 ) NOT NULL COMMENT 'Tipo do arquivo, jpeg, doc, mp3, etc..',
`Tamanho` INT NOT NULL COMMENT 'Tamanho em bytes',
`DtHrEnvio` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Data e Hora de envio'
) ENGINE = MYISAM ;
/*
Claro que você deve implementar a tabela conforme a necessidade do seu projeto.
*/
2° – Passo
O proximo passo é criar um formulário HTML, para fazermos UPLOAD do arquivo que será gravado.
Não vou entrar em detalhes dos comandos HTML.
<pre escaped=”true” lang=”html” line=”1″>
form id=”upload” action=”upload_binario.php” enctype=”multipart/form-data” method=”post”
<label>
<input id=”file” name=”file” type=”file” />
</label>
<input id=”enviar” name=”enviar” type=”submit” value=”Enviar arquivo…” />
/form
</pre>
3° – Passo
Este é o ultimo passo para envio do arquivo para o banco de dados.
Antes de prosseguir crie um arquivo para conexao com o banco de dados.
//conexao.inc.php
$conexao = mysql_connect("localhost","root","password");
mysql_select_db("binario"); |
//conexao.inc.php
$conexao = mysql_connect("localhost","root","password");
mysql_select_db("binario");
Crie um arquivo chamado upload_binario.php
require_once('conexao.inc.php');
//recupera os dados enviados atraves do formulário
//NOME TEMPORÁRIO
$file_tmp = $_FILES["file"]["tmp_name"];
//NOME DO ARQUIVO NO COMPUTADOR
$file_name = $_FILES["file"]["name"];
//TAMANHO DO ARQUIVO
$file_size = $_FILES["file"]["size"];
//MIME DO ARQUIVO
$file_type = $_FILES["file"]["type"];
//antes de ler o conteudo do arquivo você pode fazer upload para compactar em .ZIP ou .RAR, no caso de imagem você poderá redimensionar o tamanho antes de gravar no banco. Claro que depende da sua necessidade.
//Para fazer UPLOAD poderá usar COPY ou MOVE_UPLOADED_FILE
//copy($file_tmp, "caminho/pasta/$file_name");
//move_uploaded_file($file_tmp,"caminho/pasta/$file_name");
//lemos o conteudo do arquivo usando afunção do PHP file_get_contents
$binario = file_get_contents($file_tmp);
// evitamos erro de sintaxe do MySQL
$binario = mysql_real_escape_string($binario);
//montamos o SQL para envio dos dados
$sql = "INSERT INTO `binario`.`arquivos` (`Codigo` ,`NmArquivo` ,`Descricao` , `Arquivo` ,`Tipo` ,`Tamanho` ,`DtHrEnvio`)
VALUES ('NULL', 'foto.jpg', '$file_name', '$binario', '$file_type', '$file_size', CURRENT_TIMESTAMP)";
//executamos a instução SQL
mysql_query("$sql") or die (mysql_error());
? |
require_once('conexao.inc.php');
//recupera os dados enviados atraves do formulário
//NOME TEMPORÁRIO
$file_tmp = $_FILES["file"]["tmp_name"];
//NOME DO ARQUIVO NO COMPUTADOR
$file_name = $_FILES["file"]["name"];
//TAMANHO DO ARQUIVO
$file_size = $_FILES["file"]["size"];
//MIME DO ARQUIVO
$file_type = $_FILES["file"]["type"];
//antes de ler o conteudo do arquivo você pode fazer upload para compactar em .ZIP ou .RAR, no caso de imagem você poderá redimensionar o tamanho antes de gravar no banco. Claro que depende da sua necessidade.
//Para fazer UPLOAD poderá usar COPY ou MOVE_UPLOADED_FILE
//copy($file_tmp, "caminho/pasta/$file_name");
//move_uploaded_file($file_tmp,"caminho/pasta/$file_name");
//lemos o conteudo do arquivo usando afunção do PHP file_get_contents
$binario = file_get_contents($file_tmp);
// evitamos erro de sintaxe do MySQL
$binario = mysql_real_escape_string($binario);
//montamos o SQL para envio dos dados
$sql = "INSERT INTO `binario`.`arquivos` (`Codigo` ,`NmArquivo` ,`Descricao` , `Arquivo` ,`Tipo` ,`Tamanho` ,`DtHrEnvio`)
VALUES ('NULL', 'foto.jpg', '$file_name', '$binario', '$file_type', '$file_size', CURRENT_TIMESTAMP)";
//executamos a instução SQL
mysql_query("$sql") or die (mysql_error());
?
Exibindo ou baixando o arquivo do banco de dados.
Vamos criar um arquivo chamado listar.php para mostrar todos arquivos gravados em nossa tabela arquivos e o link para visualizar o arquivo.
require_once('conexao.inc.php');
$consulta = "SELECT `Codigo`,`NmArquivo`,`Descricao`,`Tipo`,`Tamanho` FROM `arquivos`";
$resultado = mysql_query($consulta);
while($dados = mysql_fetch_array($resultado)){
$Codigo = $dados['Codigo'];
echo " | Arquivo: " . $dados['NmArquivo'];
echo " | Descriçao:" . $dados['Descricao'];
echo " | Tipo:" . $dados['Tipo'];
echo " | Tamanho:" . $dados['Tamanho']; // você pode fazer divisão por 1024 para mostrar em MB
echo " >> <a href="ver_arquivo.php?codigo=$Codigo" target="_blank" rel="noopener">Ver arquivo</a>";
}
? |
require_once('conexao.inc.php');
$consulta = "SELECT `Codigo`,`NmArquivo`,`Descricao`,`Tipo`,`Tamanho` FROM `arquivos`";
$resultado = mysql_query($consulta);
while($dados = mysql_fetch_array($resultado)){
$Codigo = $dados['Codigo'];
echo " | Arquivo: " . $dados['NmArquivo'];
echo " | Descriçao:" . $dados['Descricao'];
echo " | Tipo:" . $dados['Tipo'];
echo " | Tamanho:" . $dados['Tamanho']; // você pode fazer divisão por 1024 para mostrar em MB
echo " >> <a href="ver_arquivo.php?codigo=$Codigo" target="_blank" rel="noopener">Ver arquivo</a>";
}
?
Agora criaremos o arquivo ver_arquivo.php que será responsável por mostrar o arquivo do banco de dados, selecionado
require_once('conexao.inc.php');
//recuperar o codigo do arquivo atraves do metodo GET
$codigo= $_GET['codigo'];
$consulta = "SELECT `Arquivo`,`Tipo` FROM `arquivos` WHERE Codigo= ' ".$codigo." ' ";
$resultado = mysql_query($consulta);
$dados = mysql_fetch_array($resultado);
$tipo = $dados['Tipo'];
$Arquivo = $dados['Arquivo'];
//EXIBE ARQUIVO - se o navegador não oferecer suporte para a extensão sera solicita dowload do arquivo
header("Content-type: ".$tipo."");
echo $Arquivo;
? |
require_once('conexao.inc.php');
//recuperar o codigo do arquivo atraves do metodo GET
$codigo= $_GET['codigo'];
$consulta = "SELECT `Arquivo`,`Tipo` FROM `arquivos` WHERE Codigo= ' ".$codigo." ' ";
$resultado = mysql_query($consulta);
$dados = mysql_fetch_array($resultado);
$tipo = $dados['Tipo'];
$Arquivo = $dados['Arquivo'];
//EXIBE ARQUIVO - se o navegador não oferecer suporte para a extensão sera solicita dowload do arquivo
header("Content-type: ".$tipo."");
echo $Arquivo;
?
file_get_contents — Lê todo o conteúdo de um arquivo para uma string
mysql_real_escape_string — Escapa os caracteres especiais numa string para usar em um comando SQL, levando em conta o
copy — Copia arquivo
move_uploaded_file — Move um arquivo enviado para uma nova localização
Download – banco
binario.sql
Pessoal basicamente é isto, um script que poderá ser usado de várias maneiras e melhorado por você conforme sua necessidade.