lunes, 7 de noviembre de 2011

Guardar y Extraer imágenes en MySQL con PHP

En este artículo vamos a tratar lo que es el almacenar imágenes en una Base de Datos, para este artículo vamos a utilizar MySQL.
Introducción
Quien se podría imaginar el guardar imágenes en una Base de Datos?, al principio a mi ni me pasaba por la cabeza, hasta que ya vas conociedo las herramientas y con el tiempo surgen nuevas ideas y fum!! buala!! seurge la inquietud, so podrán guardar imágenes enuna Base de Datos?,la respuesta es si.
Requerimientos
  • PHP >= 3.0.16
  • MySQL
  • Habilitar la extension en PHP sobre GD
Crear Base de datos y Tabla
Vamos a comenzar creando una Base de Datos, en nuestro caso se llama bd_banners y dentro de esta creamos una tabla (en nuestro caso se llama tbl_Banner) con los campos;
  • Id_banner (Llave, autonumérico)
  • Nombre (Texto)
  • Descripcion (Texto)
  • Imagen (Blob)
Conectarnos a la BD
Ahora simplemente nos conectamos a MySQL y seleccioanmso nuestra Base de Datosbd_banners.

$link = mysql_connect('localhost', 'root', 'password');
if (!$link)
die('Error al conectarse con MySQL: ' . mysql_error().' <br>Número del error: '.mysql_errno());
if (! @mysql_select_db("db_AdMX",$link)){
echo "No se pudo conectar correctamente con la Base de datos";
exit();
}
Almacenar imágen en la BD
Antes de almacenar la imágen en la BD, debemos de procesarla para llegar a convertirla en datos binarios.


$image = imagecreatefromgif('imagen.gif');
ob_start();
imagegif($image);
$jpg = ob_get_contents();
ob_end_clean();

imagecreatefromgif: Crear una nueva imagen a partir de un archivo o URL.
ob_start: Inica el almacenamiento en el búfer de salida.
imagegif: Producir la salida de una imagen al navegador o a un archivo.
ob_get_contents: Devolver el contenido del búfer de salida.
ob_end_clean: Limpia el búfer de salida y termina el almacenamiento en el búfer de salida.


NOTA: En este ejemplo se guarda una imágen tipo GIF, por eso se utilizan las funciones; imagecreateformgifimagegif. Si se desea almacenar una imágen tipo JPEG, utilizar las funciones; imagecreatefromjpegimagejpeg. Asi solamente se cambia el tipo de imágen enlas funciones. Para ver los tipos de imágenes que soporta PHP+GD da click aquí.
Ahora si vamos a almacenarla, para esto convertimos la infromación de la imágen en sql-safe y simplemente hacemos un query para guardar.


$jpg = str_replace('##','##',mysql_escape_string($jpg));
$result = mysql_query("INSERT INTO tbl_Banner SET Imagen='$jpg'");

Extraer la imágen de la BD y mostrarla en el navegador
Ahora vamos a extraer la imágen mediante un simple SELECT y la vamos a mostrar en el navegador.

$result = mysql_query("SELECT Imagen FROM tbl_Banner WHERE Id_imagen=11");
$result_array = mysql_fetch_array($result);
header("Content-Type: image/gif");
echo $result_array[0];

Simplemente con esto guardamos la imágen en una variable y antes de mostrarla le decimos al navegador que el contenido a mostrar es de imágen/gif. Se se va a mostrar imágenes JPEG cambiar image/gif por image/jpeg y asi para los diferentes formatos.


EJEMPLO:


//Crear BD

CREATE TABLE upload (
    id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(30) NOT NULL,
    type VARCHAR(30) NOT NULL,
    size INT NOT NULL,
    content MEDIUMBLOB NOT NULL,
    PRIMARY KEY(id)
    );

//Creamos subir.php

<html>
<head>
<title>Upload File To MySQL Database</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css">
<!--
.box {
    font-family: Arial, Helvetica, sans-serif;
    font-size: 12px;
    border: 1px solid #000000;
}
-->
</style>
</head>


<body>
<?
if(isset($_POST['upload']))
{
        $fileName = $_FILES['userfile']['name'];
        $tmpName  = $_FILES['userfile']['tmp_name'];
        $fileSize = $_FILES['userfile']['size'];
        $fileType = $_FILES['userfile']['type'];
        $fp = fopen($tmpName, 'r');
        $content = fread($fp, $fileSize);
        $content = addslashes($content);
        fclose($fp);
        if(!get_magic_quotes_gpc())
        {
            $fileName = addslashes($fileName);
        }
        include 'config.php';   $connection=mysql_connect("$bdservidor","$bdunombre","$bdpass")
or die("Error conectando a la base de datos");
$db=mysql_select_db("$bdnombre",$connection)
or die ("Error seleccionando la base de datos");        
        $query = "INSERT INTO upload (name, size, type, content ) ".
                 "VALUES ('$fileName', '$fileSize', '$fileType', '$content')";
        mysql_query($query) or die('Error, query failed');                 
                
       echo "<br>File $fileName uploaded<br>";
}        
?>
<form action="" method="post" enctype="multipart/form-data" name="uploadform">
  <table width="350" border="0" cellpadding="1" cellspacing="1" class="box">
    <tr> 
      <td width="246"><input type="hidden"
name="MAX_FILE_SIZE" value="2000000"><input name="userfile"
type="file" class="box" id="userfile">
         </td>
      <td width="80"><input name="upload" type="submit" class="box" id="upload" value="  Upload  "></td>
    </tr>
  </table>
</form>
</body>
</html>

//Creamos bajar.php

<?
if(isset($_GET['id']))
{
    include 'config.php';
    $connection=mysql_connect("$bdservidor","$bdunombre","$bdpass")
or die("Error conectando a la base de datos");
$db=mysql_select_db("$bdnombre",$connection)
or die ("Error seleccionando la base de datos");


    $id      = $_GET['id'];
    $query   = "SELECT name, type, size, content FROM upload WHERE id = '$id'";
    $result  = mysql_query($query) or die('Error, query failed');
    list($name, $type, $size, $content) = mysql_fetch_array($result);


    header("Content-Disposition: attachment; filename=$name");
    header("Content-length: $size");
    header("Content-type: $type");
    echo $content;


    exit;
}


?>
<html>
<head>
<title>Download File From MySQL</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>


<body>
<?
include 'config.php';
$connection=mysql_connect("$bdservidor","$bdunombre","$bdpass")
or die("Error conectando a la base de datos");
$db=mysql_select_db("$bdnombre",$connection)
or die ("Error seleccionando la base de datos");
$query  = "SELECT id, name FROM upload";
$result = mysql_query($query) or die('Error, query failed');
if(mysql_num_rows($result) == 0)
{
    echo "Database is empty <br>";

else
{
    while(list($id, $name) = mysql_fetch_array($result))
    {
?>
    <a href="download.php?id=<?=$id;?>"><?=$name;?></a> <br>
<?        
    }
}
?>
</body>
</html>

//download.php

<?
if(isset($_GET['id']))
{
    include 'config.php';
$connection=mysql_connect("$bdservidor","$bdunombre","$bdpass")
or die("Error conectando a la base de datos");
$db=mysql_select_db("$bdnombre",$connection)
or die ("Error seleccionando la base de datos");
    $id      = $_GET['id'];
    $query   = "SELECT name, type, size, content FROM upload WHERE id = '$id'";
    $result  = mysql_query($query) or die('Error, query failed');
    list($name, $type, $size, $content) = mysql_fetch_array($result);
    header("Content-Disposition: attachment; filename=$name");
    header("Content-length: $size");
    header("Content-type: $type");
    echo $content;
    exit;
}


?>
<html>
<head>
<title>Download File From MySQL</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>


<body>
<?
include 'config.php';
$connection=mysql_connect("$bdservidor","$bdunombre","$bdpass")
or die("Error conectando a la base de datos");
$db=mysql_select_db("$bdnombre",$connection)
or die ("Error seleccionando la base de datos");
$query  = "SELECT id, name FROM upload";
$result = mysql_query($query) or die('Error, query failed');
if(mysql_num_rows($result) == 0)
{
    echo "Database is empty <br>";

else
{
    while(list($id, $name) = mysql_fetch_array($result))
    {
?>
    <a href="download.php?id=<?=$id;?>"><?=$name;?></a> <br>
<?        
    }
}
?>
</body>
</html>

//config.php

<?php
$bdservidor = "localhost";
$bdunombre = "root";
$bdpass = "0336";
$bdnombre = "test";
?>




Habilitar GD en Xampp

Para habilitar GD en Xampp (GD es la librería de tratamiento de imágenes en PHP), lo que tenemos que hacer es modificar el archivo php.ini y localizar la línea que habilita la carga de la librería dll.

Usualmente la encontramos en /xampp/apache/bin/php.ini pero podría estar utilizando otro archivo php.ini de acuerdo a tu instalación.
Para habilitar la librería GD, asegurate que la siguiente línea esté descomentada:

extension=php_gd2.dll


Luego, fíjate en el phpinfo() y busca el bloque de información GD, que desplegará una salida como la siguiente:


Crear archivo html de un archivo php

fopen() asocia un recurso nominado, especificado por filename, a un flujo.

------------------------>01

//crea
$control = fopen("$titulo".".html","w+");
if($control == false){
  die("No se ha podido crear el archivo.");
}

----------------------->02


<?php
$fichero_salida="out.html";
$tabla="<table width=200 border=1>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
</table>";
$fp=fopen($fichero_salida,"w+");
fwrite($fp,$tabla);
fclose($fp);
if(!file_exists($fichero_salida)) die("Error en la Generacion del Archivo");
else echo "Archivo " . $fichero_salida . "Generado. <a href=" . $fichero_salida . ">Bajar Click Derecho y Guardar Destino Como...</a>";