Mostrar una imagen desde blob mysql usando PHP
Para que el script se muestre como una imagen necesitamos usar la cabecera Content-type y poner el tipo MIME de la imagen que recuperaremos de la tabla, esto es:
Donde image/gif es el el tipo MIME para una imagen GIF.
Desarrollo del Script
Las imágenes han sido guardadas en la tabla y tienen un único identificador representado por el campo idfoto, la imagen original se guarda en el campo foto, la miniatura en el campo thumb y el tipo MIME en el campo mime, como podemos ver en la estructura de la tabla:
CREATE TABLE `tabla` ( `idfoto` int(3) NOT NULL AUTO_INCREMENT, `nombre` varchar(255) NOT NULL DEFAULT '', `foto` blob NOT NULL, `thumb` blob NOT NULL, `mime` varchar(40) NOT NULL DEFAULT '', PRIMARY KEY (`idfoto`) ) ;
Necesitamos enviar parámetros al script para indicarle el id de la imagen que queremos ver, y también si queremos ver la imagen original o su miniatura, suponiendo que el archivo que contiene al script se llame verblob.php
:
Donde el parámetro idfoto indica el id de la imagen, y el parametro tam indica si va a mostrar la imagen original o la miniatura (1 para mostrar la imagen original y 2 para mostrar la miniatura). El script trabaja de la siguiente manera:
// Parámetros para recuperar la imagen # Recuperamos el parámetro GET con el id único de la foto que queremos mostrar $idfoto = (isset($_GET["idfoto"])) ? $_GET["idfoto"] : exit(); # Recuperamos el parámetro GET para elegir entre la miniatura o la foto real $tam = (isset($_GET["tam"])) ? $_GET["tam"] : 1; // Escojemos la foto real o la miniatura según la variable $tam switch($tam) { case "1": $campo = "foto";break;; case "2": $campo = "thumb";break;; default: $campo = "foto";break;; }
Ya sabiendo el id de la imagen que vamos a mostrar, hacemos la consulta a la base de datos:
// Recuperamos la foto de la tabla $sql = "SELECT $campo, mime FROM tabla WHERE idfoto = $idfoto"; # Conexión a la base de datos $link = mysql_connect(DBHOST, DBUSER, DBPASSWORD) or die(mysql_error($link));; mysql_select_db(DBNAME, $link) or die(mysql_error($link)); $conn = mysql_query($sql, $link) or die(mysql_error($link)); $datos = mysql_fetch_array($conn); // La imagen $imagen = $datos[0]; // El mime type de la imagen $mime = $datos[1]; // Gracias a esta cabecera, podemos ver la imagen // que acabamos de recuperar del campo blob header("Content-Type: $mime"); // Muestra la imagen echo $imagen;
Conclusiones
Los campos blob no solo nos permiten guardar imágenes, sino una gran variedad de datos, para mostrarlos solo hay que tener en cuenta el tipo MIME del archivo que hemos guardado, y al momento de recuperarlo sólamente utilizamos header con el Content-Type.
Elementos Utilizados
Referencias
Autor
Braulio Andrés Soncco Pimentel
Programador - Diseñador
braulio at buayacorp.com

Tino dijo
Estuve intentando hacer algo parecido y en local todo muy bien pero al subirlo al servidor ni veo las miniaturas ni la imagen. Os dejo el código por si se os ocurreo algo.
La imagen la muestro así
echo "
Y verimagen.php :
alert (\"entra\"); ";
// Parámetros para recuperar la imagen
# Recuperamos el parámetro GET con el id único de la foto que queremos mostrar
$idfoto = (isset($_GET["idfoto"])) ? $_GET["idfoto"] : exit();
# Recuperamos el parámetro GET para elegir entre la miniatura o la foto real
include "conexion.php";
include("mainfile.php");
$sql = "SELECT thumb,tipo FROM imagenes WHERE idfoto=$idfoto";
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
$image = $row[0];
$tipo = $row[1];
Header("Content-type: $tipo");
echo($image);
?>
Y ampliarimagen.php
sql_query($sql);
$row = $db->sql_fetchrow($result);
$image = $row[0];
$tipo = $row[1];
Header("Content-type: $tipo");
echo($image);
?>
Y no me funciona me muestra numeros y letras,,...el problema típico miré y rebusqué cientos de soluciones en foros y no hay manera lo raro es que funciona en local, probé con rutas relativas, absolutas,....y se os ocurre algo??
8 Junio 2009 | 08:36 PM