Cargar y Almacenar imagen en MySQL con PHP.

Cargar y Almacenar imagen en MySQL con PHP. Cuando hablamos de subir imágenes al servidor se nos viene a la cabeza cargar la imagen en un directorio especificado y el nombre de la imagen almacenarlo en la base de datos.

¿Se puede subir una imagen sin almacenar en el servidor?

La respuesta es sí se puede hacer usando la base de datos MySQL. En algunos casos nuestro servidor está lleno y ya no podemos almacenar más imágenes, pero puede insertar un archivo de imagen en la base de datos sin subirlo en la carpeta. Este procedimiento nos ayuda a no llenar el servidor porque el contenido del archivo de imagen se almacena directamente en la base de datos en lugar del disco del servidor.

Cargar y Almacenar imagen en MySQL PHP

En este artículo, daremos solución a esta gran incógnita, de cómo almacenar el fichero de imagen en la base de datos MySQL y posteriormente poder recuperar la imagen de la base de datos.
No es tan complicado almacenar y recuperar imágenes de la base de datos utilizando PHP y MySQL. Aquí un ejemplo sencillo.

<img src='vista.php?id=4' alt='Img blob desde MySQL' width="600" />      

Sin embargo, podemos utilizar las ventajas de este potente gestor MySQL.

Hay 4 tipos de BLOB disponibles: TINYBLOB, Blob, MEDIUMBLOB y LONGBLOB.Usaremos el tipo de datos LONGBLOB en la base de datos MySQL.
Nuestra tabla images_tabla.sql

CREATE TABLE IF NOT EXISTS `images_tabla` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `imagenes` longblob NOT NULL,
  `creado` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;

Formulario de subida de imagen

Mostrando el formulario a utilizar y permitirá a los usuarios elegir el archivo de imagen que desea cargar al servidor de base de datos MySQL.
Index.php

      <form name="MiForm" id="MiForm" method="post" action="cargar.php" enctype="multipart/form-data">
        <h4 class="text-center">Seleccione imagen a cargar</h4>
        <div class="form-group">
          <label class="col-sm-2 control-label">Archivos</label>
          <div class="col-sm-8">
            <input type="file" class="form-control" id="image" name="image" multiple>
          </div>
          <button name="submit" class="btn btn-primary">Cargar Imagen</button>
        </div>
      </form>

Cargar y almacenar imagen en MySQL

Almacenar imagen en la base de datos (cargar. php)

El archivo de carga.php contiene las siguientes funcionalidades.

Fichero cargar.php

<?php
if(isset($_POST["submit"])){
    $revisar = getimagesize($_FILES["image"]["tmp_name"]);
    if($revisar !== false){
        $image = $_FILES['image']['tmp_name'];
        $imgContenido = addslashes(file_get_contents($image));
        
        //Credenciales Mysql
        $Host = 'localhost';
        $Username = 'root';
        $Password = 'root';
        $dbName = 'images_db';
        
        //Crear conexion con la abse de datos
        $db = new mysqli($Host, $Username, $Password, $dbName);
        
        // Cerciorar la conexion
        if($db->connect_error){
            die("Connection failed: " . $db->connect_error);
        }
        
        
        //Insertar imagen en la base de datos
        $insertar = $db->query("INSERT into images_tabla (imagenes, creado) VALUES ('$imgContenido', now())");
        // COndicional para verificar la subida del fichero
        if($insertar){
            echo "Archivo Subido Correctamente.";
        }else{
            echo "Ha fallado la subida, reintente nuevamente.";
        } 
        // Sie el usuario no selecciona ninguna imagen
    }else{
        echo "Por favor seleccione imagen a subir.";
    }
}
?>

Recuperar imagen de la base de datos y mostrarla

Aquí, mostramos en el navegador la imagen almacenada en nuestra base de datos.

Fichero ver.php

  <?php
    $cumple = false;
    if(isset($_POST['add']))
    {
        $numero=$_POST['numero'];
        
   }

echo"<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<title>Ver imagen en la base de datos MySQL usando PHP</title>
<link rel='stylesheet' href='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css'>
<style type='text/css'>
*{ font-family:Segoe, 'Segoe UI', 'DejaVu Sans', 'Trebuchet MS', Verdana, sans-serif}
.main{ margin:auto; border:1px solid #7C7A7A; width:60%; text-align:left; padding:30px; background:#85c587}
input[type=submit]{ background:#6ca16e; width:100%;
    padding:5px 15px; 
    background:#ccc; 
    cursor:pointer;
	font-size:16px;
   
}
input[type=text]{  width:40%;
    padding:5px 15px; height:25px;
	font-size:16px;
   
}
.form-control {
	padding: 0px 0px;
}
</style>
</head>
<body bgcolor='#bed7c0'><br>
<div class='main'>
<h1>Mostrando imagen almacenada en MySQL</h1>
    
   <form action='' method='post'>
     <table width='330' height='135' border='0' class='text'>
         <tr>
             <td><label>User Name</label></td>
             <td><input type='text' name='numero' id='numero'></td> 
         </tr>

         <tr>
             <td align='center'>
                <button type='submit' id='boton' name='add' >Verificar</button>
             </td>
         </tr>
     </table>
  </form>
    
  <div class='panel panel-primary'>
    <div class='panel-body'>'
        
<img src='vista.php?id=".$numero."' alt='Img blob desde MySQL' width='600' >      
 	  </div> 
    </div>
 </div>
</body>
</html>
"
  ?>                             
                                    

Archivo Vista.php

Este archivo  tiene la función de  extraer imagen de la BD mediante el método GET. Sin embargo, si la imagen tiene errores mostrara un mensaje “Imagen no existe“.

<?php
if(!empty($_GET['id'])){
    //Credenciales de conexion
    $Host = 'localhost';
    $Username = 'root';
    $Password = 'root';
    $dbName = 'images_db';
    
    //Crear conexion mysql
    $db = new mysqli($Host, $Username, $Password, $dbName);
    
    //revisar conexion
    if($db->connect_error){
       die("Connection failed: " . $db->connect_error);
    }
    
    //Extraer imagen de la BD mediante GET
    $result = $db->query("SELECT imagenes FROM images_tabla WHERE id = {$_GET['id']}");
    
    if($result->num_rows > 0){
        $imgDatos = $result->fetch_assoc();
        
        //Mostrar Imagen
        header("Content-type: image/jpg"); 
        echo $imgDatos['imagenes']; 
    }else{
        echo 'Imagen no existe...';
    }
}
?>

Mostrando imagen almacenada en MySQL