This page was exported from Recursos para programadores [ https://eldesvandejose.com ]
Export date: Mon Aug 26 5:29:55 2019 / +0000 GMT

Almacenar imágenes en base de datos con PHP




Almacenar imágenes en el servidor de producción con PHP es muy sencillo. Basta subir un fichero y, tras unas comprobaciones rutinarias, almacenarlo en el directorio deseado con move_uploaded_file(). Si nunca has usado esta técnica, puedes revisar este post.

En este artículo veremos cómo almacenar una imagen en forma de datos binarios en una tabla de una base de datos de MySQL.

LA BASE DE DATOS

Lo primero que debemos tener es, por supuesto, una base de datos con una tabla para almacenar las imágenes. Para este post yo he creado una muy simple con los campos mínimos necesarios, aunque tu base de datos puede tener las tablas y campos que necesites. La base de datos se llama imagenes y la tabla que he creado (alarde de creatividad), tiene el mismo nombre:

CREATE TABLE imagenes (

id int(11) NOT NULL,

imagen blob NOT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

En lo que debemos fijarnos es en el campo llamado imagen, que es de tipo BLOB, lo que permite almacenar datos de hasta 65535 bytes. Si tus imágenes van a tener mayor tamaño, una vez convertidas a datos binarios, deberías usar un campo mayor, cómo LONGBLOB, que te permite imágenes de hasta 4 Gb. No obstante, piénsatelo. Si no es imprescindible, es aumentar innecesariamente el tamaño de tu base de datos. Si tienes un elevado número de registros, podrías llegar a experimentar ralentizaciones muy molestas.

ALMACENANDO LA IMAGEN

Lo primero es. cómo no, enviar la imagen al servidor. Vamos a hacerlo con un código muy simple que nos sirve, únicamente, para ilustrar el funcionamiento de esto. Se llama subir.php:

<?php

?>

<!DOCTYPE html>

<html lang='en'>

<head>

<meta charset='UTF-8'>

<title>Imágenes</title>

</head>

<body>

<form action='grabar.php' method='post' enctype='multipart/form-data'>

Imagen:

<input type='file' name='imagen'>

<br>

<input type='submit' value='Enviar'>

</form>

</body>

</html>

El script que recibe la imagen se llama grabar.php:

<?php

/* Se conecta con la base de datos elegida. */

$conexion = new PDO('mysql:host=localhost;dbname=imagenes;charset=UTF8', 'root', 'root');

$conexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$datos = base64_encode(file_get_contents($_FILES['imagen']['tmp_name']));

try{

$consulta = "INSERT INTO imagenes (";

$consulta .= "imagen";

$consulta .= ") VALUES (";

$consulta .= "'".$datos."');";

$conexion->query($consulta);

} catch (Exception $e) {

die ("Se produjo un error");

}

echo "Imagen almacenada.";

?>

Cómo puedes ver, lo que hacemos es convertir el fichero subido a una cadena codificada en base 64, que luego es la que almacenamos en la base de datos. Podríamos haber incluido un filtro, para comprobar, por ejemplo, que el tipo MIME del archivo subido corresponda a una imagen, pero eso lo damos, en este ejemplo, por sentado.

LEER LA IMAGEN

Bien. Ya tenemos una imagen almacenada como datos, en nuestra tabla. Ahora viene el momento de leerla y poder enviarla como imagen al navegador, de modo que sea visible para el usuario.

Lo primero es leer los datos y descodificarlos en base 64, para recuperar el original. Esto lo hacemos mediante un script al que hemos llamado leer.php:

<?php

/* Se conecta con la base de datos elegida. */

$conexion = new PDO('mysql:host=localhost;dbname=imagenes;charset=UTF8', 'root', 'root');

$conexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$consulta = "SELECT imagen FROM imagenes WHERE id='1';";

$hacerConsulta = $conexion->prepare($consulta); // Se crea un objeto PDOStatement.

$hacerConsulta->execute(); // Se ejecuta la consulta.

$datos = $hacerConsulta->fetch(PDO::FETCH_ASSOC)["imagen"]; // Se recuperan los resultados.

$hacerConsulta->closeCursor(); // Se libera el recurso.

$datos = base64_decode($datos);

echo $datos;

?>

Por último, usamos el retorno de este script en mostrar.php, para que se renderice la imagen original en el navegador:

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>Imagen</title>

</head>

<body>

<img src='leer.php' border='0'>

</body>

</html>

Y ya está. Cómo ves, fácil y rápido.

 

 


Post date: 2016-10-03 18:29:46
Post date GMT: 2016-10-03 18:29:46
Post modified date: 2016-10-06 09:44:26
Post modified date GMT: 2016-10-06 09:44:26

Powered by [ Universal Post Manager ] plugin. MS Word saving format developed by gVectors Team www.gVectors.com