Almacena y muestra imágenes (BLOB ) desde MySQL usando PHP

0
22
PHP
PHP

Normalmente cuando subimos una imagen por PHP se almacena en una carpeta del servidor y el nombre se inserta en la BBDD. Sin embargo, puedes utilizar la BBDD para almacenar imágenes. Este procedimiento ayuda a optimizar el espacio del servidor ya que no se sube al servidor directamente.

En este tutorial vamos a mostrar cómo almacenar el archivo de imagen en la base de datos MySQL y recuperar la imagen usando PHP.

Insertar archivo de imagen en MySQL

MySQL tiene un tipo de datos llamado BLOB (objeto binario grande) que puede contener una gran cantidad de datos binarios. El tipo de datos BLOB es perfecto para las imágenes. Existen hasta 4 tipos diferentes de BLOB: TINYBLOB, BLOB, MEDIUMBLOB y LONGBLOB.

Con la siguiente consulta creamos una tabla de tipo LONGBLOB que será donde se almacen las imágenes.

Paso uno: Primero creamos la tabla:

CREATE TABLE `images` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `image` longblob NOT NULL,
 `created` datetime NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

 Paso dos: Formulario para subir la imgen – HTML

<!DOCTYPE html>
<html lang="en">
<body>
    <form action="upload.php" method="post" enctype="multipart/form-data">
        Select image to upload:
        <input type="file" name="image"/>
        <input type="submit" name="submit" value="UPLOAD"/>
    </form>
</body>
</html>

Paso tres: Archivo php para almacenar la imagen en la base de datos (upload.php)

Este archivo contiene las siguientes características:

  • Comprueba si el usuario ha seleccionado una imagen
  • Recupera el contenido del archivo con tmp_name
  • Crea una conexión a la BBDD MySQL y selecciona la base de datos
  • Inserta el contenido binario de la imagen en la correspondiente tabla
  • Muestra el estado de carga de la imagen
<?php
if(isset($_POST["submit"])){
    $check = getimagesize($_FILES["image"]["tmp_name"]);
    if($check !== false){
        $image = $_FILES['image']['tmp_name'];
        $imgContent = addslashes(file_get_contents($image));

        /*
         * Recoge los datos
         */
        
        //DB details
        $dbHost     = 'localhost';
        $dbUsername = 'root';
        $dbPassword = '*****';
        $dbName     = 'quecosasleo';
        
        //Crea la conexión
        $db = new mysqli($dbHost, $dbUsername, $dbPassword, $dbName);
        
        // Check connection
        if($db->connect_error){
            die("Connection failed: " . $db->connect_error);
        }
        
        $dataTime = date("Y-m-d H:i:s");
        
        //Inseta el contenido de la imagen en la tabla 
        $insert = $db->query("INSERT into images (image, created) VALUES ('$imgContent', '$dataTime')");
        if($insert){
            echo "File uploaded successfully.";
        }else{
            echo "File upload failed, please try again.";
        } 
    }else{
        echo "Please select an image file to upload.";
    }
}
?>

Paso cuatro: Recupera la imagen de la base de datos en formato BLOB (view.php)

Con este archivo recuperamos la imagen de la base de datos en formato BLOB. Para mostrar una imagen en la web utilizamos el encabezado content-type.

Con este archivo recuperaremos el contenido de la imagen de la base de datos MySQL en función de la ID y la visualización en la página web. Para mostrar la imagen en la página web utilizamos el encabezado Content-type.

<?php
if(!empty($_GET['id'])){
    //DB details
    $dbHost     = 'localhost';
    $dbUsername = 'root';
    $dbPassword = '*****';
    $dbName     = 'quecosasleo';
    
    //Crea la conexion 
    $db = new mysqli($dbHost, $dbUsername, $dbPassword, $dbName);
    
    //Check connection
    if($db->connect_error){
       die("Connection failed: " . $db->connect_error);
    }
    
    //Recoge los datos 
    $result = $db->query("SELECT image FROM images WHERE id = {$_GET['id']}");
    
    if($result->num_rows > 0){
        $imgData = $result->fetch_assoc();
        
        //Representa la imagen de formato blob 
        header("Content-type: image/jpg"); 
        echo $imgData['image']; 
    }else{
        echo 'Image not found...';
    }
}
?>

 

Dejar respuesta

Please enter your comment!
Please enter your name here