Em muitas aplicações comerciais ou científicas é necessário que se armazenem imagens na base de dados. Apesar de muitos especialistas garantirem que é mais eficiente armazenar imagens em arquivos ao invés de tabelas, não são raros aqueles que sentem dificuldade em gerenciar arquivos fora do banco de dados. Por esta razão este artigo foi desenvolvido. Nele apresentamos uma introdução sobre o armazenamento de imagens em tabelas MySQL utilizando a linguagem PHP.

Tipos blob

Como você deve saber existe uma série de tipos de campos definidos no MySQL: inteiros, texto regular, números reais, etc. A diferença principal entre estes campos (tipos primários) e o blob é principalmente a quantidade de informação que se consegue armazenar.

Um blob é um campo binário grande que pode uma gama variada de dados. Os quatro tipos blob existentes no MySQL são: TINYBLOB, BLOB, MEDIUMBLOB, e LONGBLOB. Estes tipos diferem apenas no tamanho máximo de bytes que podem armazenar. É neste tipo de campo que armazenamos imagens no MySQL.

Criando a tabela no banco

A Listagem 1 nos mostra como criar uma tabela no MySQL que contenha um campo blob. A tabela que iremos criar se chama PESSOA e contém um ID (Chave primária) e a imagem da pessoa.


CREATE TABLE PESSOA ( 
PES_ID int NOT NULL AUTO_INCREMENT PRIMARY KEY, 
PES_IMG BLOB 
);
Listagem 1. Script de criação da tabela no banco

Inserindo a imagem na tabela criada

As Listagens 2 e 3 mostram um exemplo de formulário de upload e script PHP que armazena a imagem recebida na tabela MySQL. Note que o form tem a propriedadeenctype="multipart/form-data" e a action aponta para o arquivo PHP que salva a imagem.


<html>
<head>
		<title>Upload de imagens com PHP</title>
		<meta charset="utf-8"/>
</head>
<body>
	<form action="gravar.php" method="POST" enctype="multipart/form-data">
		<label for="imagem">Imagem:</label>
		<input type="file" name="imagem"/>
		<br/>
		<input type="submit" value="Enviar"/>
	</form>
</body>
</html>
Listagem 2. Formulário de upload

<?php

$imagem = $_FILES["imagem"];
$host = "localhost";
$username = "root";
$password = "";
$db = "test";

if($imagem != NULL) { 
	$nomeFinal = time().'.jpg';
	if (move_uploaded_file($imagem['tmp_name'], $nomeFinal)) {
		$tamanhoImg = filesize($nomeFinal); 

		$mysqlImg = addslashes(fread(fopen($nomeFinal, "r"), $tamanhoImg)); 

		mysql_connect($host,$username,$password) or die("Impossível Conectar"); 

		@mysql_select_db($db) or die("Impossível Conectar"); 

		mysql_query("INSERT INTO PESSOA (PES_IMG) VALUES ('$mysqlImg')") or 
		die("O sistema não foi capaz de executar a query"); 

		unlink($nomeFinal);
		
		header("location:exibir.php");
	}
} 
else { 
	echo"Você não realizou o upload de forma satisfatória."; 
} 

?>
Listagem 3. Script de gravação da imagem no banco

Este trecho é simplesmente o necessário para se inserir uma imagem em um banco de dados MySQL. É importante que se cheque o packet size máximo configurado no servidor MySQL. Caso este valor esteja muito pequeno podem ocorrer erros de gravação do arquivo na tabela.

Exibindo as imagens gravadas anteriormente

Neste ponto já sabemos como gravar as imagens na tabela. Mas de que adianta gravarmos se não conseguirmos recuperá-las? O trecho de código para recuperação das figuras é um pouco mais complicado do que o código de armazenamento. Entretanto, não podemos considerá-lo um código extremamente complicado. As Listagens 4 e 5 mostram o código do arquivo principal de exibição das imagens e do arquivo getImagem.php, que nos retorna uma única imagem a partir do ID do cadastro.


<?php

$host = "localhost";
$username = "root";
$password = "";
$db = "test";

mysql_connect($host,$username,$password) or die("Impossível conectar ao banco."); 

@mysql_select_db($db) or die("Impossível conectar ao banco"); 

$result=mysql_query("SELECT * FROM PESSOA") or die("Impossível executar a query"); 

while($row=mysql_fetch_object($result)) { 
	echo "<img src='getImagem.php?PicNum=$row->PES_ID' \">"; 
} 

?>
Listagem 4. Arquivo exibir.php

<?php
	$host = "localhost";
	$username = "root";
	$password = "";
	$db = "test";
	$PicNum = $_GET["PicNum"];

	mysql_connect($host,$username,$password) or die("Impossível conectar ao banco."); 
	@mysql_select_db($db) or die("Impossível conectar ao banco."); 
	$result=mysql_query("SELECT * FROM PESSOA WHERE PES_ID=$PicNum") or die("Impossível executar a query "); 
	$row=mysql_fetch_object($result); 
	Header( "Content-type: image/gif"); 
	echo $row->PES_IMG; 
?>
Listagem 5. Arquivo getImagem.php

Bem, apesar do exemplo ser simples, espero ter ajudado aos iniciantes no armazenamento de imagens em bancos de dado MySQL. O código fonte de exemplo encontra-se disponível para download no topo da página.

Links Úteis

Saiba mais sobre Mobile ;)

  • Tutorial de MySQL: Conheça desde o básico até o avançado no MySQL, entenda suas funções e como suas aplicações podem decolar com este banco de dados.
  • PHP: Declaração e atribuição de variáveis: Neste documento você encontrará o conteúdo que precisa para aprender a declarar e utilizar variáveis na linguagem PHP. É por meio das variáveis que conseguimos guardar os dados em memória e acessá-los quando necessário.
  • Serialização: como funciona o processo no PHP: Serialização tem como principal objetivo transformar um objeto em uma forma binária ou em formato de texto para poder transmiti-lo via rede ou armazenar seu conteúdo sem perda de dados. Veja como funciona o processo de serialização no PHP.