Portal » Programacion PHP » Guardar una imagen en la Base de Datos (mysql)

Guardar una imagen en la Base de Datos (mysql)

A continuacion mostraremos una sencilla forma de como realizar la subida de imagenes a nuestra base de datos y no a nuestro servidor.

Inicialmente creamos nuestra bd y lo llamamos “bd_laboratorio“, luego creamos la tabla usando este sql

CREATE TABLE IF NOT EXISTS `subir_imagen` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nombre_imagen` text NOT NULL,
  `imagen` mediumblob NOT NULL,
  `tipo` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Archivo index.php

<?php
//conexion a la base de datos
$link mysql_connect('localhost''root''');
if (!$link)
   die('Error al conectarse con MySQL: ' mysql_error().' <br>Número del error: '.mysql_errno());
if (! @mysql_select_db("bd_laboratorio",$link)){
   echo "No se pudo conectar correctamente con la Base de datos";
   exit();
}
//le dimos click al boton grabar?
if (isset($_POST['guardar']))
{
$nombre $_FILES['imagen']['name'];
$imagen_temporal $_FILES['imagen']['tmp_name'];
$type $_FILES['imagen']['type'];
//archivo temporal en binario
$itmp fopen($imagen_temporal'r+b');
$imagen fread($itmpfilesize($imagen_temporal));
fclose($itmp);
//escapando los caracteres
$imagen mysql_real_escape_string($imagen);$respuesta mysql_query("insert into subir_imagen (id, nombre_imagen, imagen, tipo) 
values(0, '$nombre', '$imagen', '$type')"$link);
//redireccionamos
header("Location: index.php?".($respuesta 'ok' 'error'));
}
//guardado OK
if (isset($_GET['ok']))
{
echo '<p>Guardado Exitosamente</p>';}
//si no se guardo de manera correcta?
if (isset($_GET['error']))
{
echo '<p>Ocurrio un error a la hora de realizar la insercion...</p>';}

//formulario que nos permite subir a la BD el archivo
echo '
<form action="index.php" enctype="multipart/form-data" method="post">
<input type="file" name="imagen" id="imagen" />
<input type="submit" value="Guardar" name="guardar" />
</form>';
$sql mysql_query("select id, nombre_imagen, imagen from subir_imagen"$link);
$imagenes = array();
while($row mysql_fetch_assoc($sql))
{
$imagenes[$row['id']] = array(
'id' => (int) $row['id'],
'nombre' => $row['nombre_imagen'],
'imagen' => $row['imagen'],
);
}
//existen imagenes para mostrar?
if (!empty($imagenes))
{
echo '<span style="text-decoration:underline;">Imagenes guardadas en la BD:</span>';
foreach($imagenes as $valor)
echo '<p>'$valor['id'] ,' - ' $valor['nombre'] ,' - <a href="ver.php?i='$valor['id'] ,'">Ver Imagen</a></p>';
}
?>

Dicho archivo nos permitira hacer la busqueda y posterior subida a nuestra base de datos, y finalmente poder visualizar el mismo en un listado.

El archivo ver.php nos permitirá visualizar la imagen subida a la Base de Datos.

<?php
//conexion a la base de datos
$link mysql_connect('localhost''root''');
if (!$link)
   die('Error al conectarse con MySQL: ' mysql_error().' <br>Número del error: '.mysql_errno());
if (! @mysql_select_db("bd_laboratorio",$link)){
   echo "No se pudo conectar correctamente con la Base de datos";
   exit();
}
//si enviamos por parametro la id
$id = (int) $_GET['i'];
//no hay id
if (empty($id))
//redireccionamos
header("Location: index.php");$sql mysql_query("select id, imagen, tipo from subir_imagen where id = $id"$link);
$imagenes = array();
while($row mysql_fetch_assoc($sql))
$imagenes[$row['id']] = array(
'id' => $row['id'],
'imagen' => $row['imagen'],
'tipo' => $row['tipo'],
);
//existen imagenes para mostrar?
if (!empty($imagenes))
{
header("Content-Type: ".$imagenes[$id]['tipo']);
echo $imagenes[$id]['imagen'];
}
?>

Esta seria una forma de subir imagenes a nuestra base de datos, cabe mencionar que necesitarian de buen espacio de almacenamiento en su BD asi se evitan futuros problemas por espacio en el mismo  :)

Quedandonos la visualizacion final de la siguiente forma

Acerca de vicram10

Licenciado en Ciencias Informaticas con enfasis a Analisis de Sistemas Informaticos. Egresado de la Facultad Politecnica UNA. Apasionado de la tecnologia y del desarrollo de aplicaciones, desde el 2007 recorriendo por la internet.
  • Fernando M

    ¡Muchas Gracias VICRAM 10 !. Excelente tu aporte, y el código funcionó
    de maravillas, sin errores!. Necesitaba guardar fotos en una clínica
    sobre estudios, y debe ser del modo más seguro. Sé que es mejor
    almacenar imágenes en una carpeta y subir un link a la DB con el cual
    acceder a dichas fotos. Pero alguien malicioso puede cambiar el nombre
    de las fotos, y no sé de que forma evitar que esto suceda. ¿Hay alguna
    forma de “identificación interna” , inequívoca de una foto en
    particular, para asegurarse de que no pueda ser otra foto?. Ojalá pueda
    consultarte en Facebook, o email. Soy Fernando y desde Córdoba,
    Argentina teenvío un gran Abrazo agradecido. Hasta Siempre!

    • webmercadonegro

      ahi te he respondido, no le pulse al boton reply y se me fue en otro comentario 😛

      vicram10

  • webmercadonegro

    la forma como en su momento he realizado ese tipo de planteamiento es que yo mismo antes de subir el archivo a el servidor, le cambio el nombre por uno que se genera aleatoriamente con numeros y usando time() y para saber que le pertenece a tal o cual articulo dicha imagen en la base se guarda justamente esa relacion, que TAL ID le corresponde a las siguientes imagenes.. y asi visualizar tu resultado.

    Nadie tendra acceso a la modificacion de dichas imagenes siempre y cuando los permisos de archivo sean las correctas (chmod 644) …

    vicram10

  • Fernando M

    ¡Muchas Gracias VICRAM 10 nuevamente!. Tu respuesta ha sido rápida y precisa. En casos de Informática Médica, donde el futuro apunta a digitalizar muchas imágenes, como una Tomografía TAC, etc, no se puede correr el riesgo de que dichas imágenes pueden ser alteradas, por lo que supongo que se deberá contar con discos duros de varios Terabytes no? . Estoy viendo la posibilidad de trabajar con imágenes en un CD, las cuales no pueden alterarse, y llamar con php desde mi sitio web, en local para un archivo-imagen específico del CD, pero no he podido-sabido hacerlo. Si tienes alguna respuesta, cuando puedas.., no quiero abusar, esperaré tu respuesta. Estoy humildemente a tus órdenes. Perdona, se puede saber en que país estás?. Un gran abrazo, agradecido siempre. Fer

  • webmercadonegro

    de poder todo se puede.. aunque es mas dificil de ese modo por que para poder visualizar una imagen en la net, deberas de tener en tu propio hosting, y solo si tienes un hosting windows podria ser que se pueda simular este tipo de interrogante, con easyphp y windows se podria, pero sera mas facil guardarlo en la base de datos usando este ejemplo ya que asi sera muy improbable que pueda ser modificado, siempre y cuando la seguridad de tu BD sea la mejor, sino igual podran alterar, y si.. se necesita mucho espacio en disco o bd para el tipo de web que mencionas..

    yo soy de paraguay 😉 ahora mismo mientras contesto mi señora de paso esta mirando “el transportador 2” jaja..

  • franklinrony

    Justo lo que buscaba victor, nuevamente te luiciste,en cuanto a rendimiento cuando es recomendable guardar la imagen directamente en la BD?se em ocurre que para fotografias de carnet seria viable pero si fuesen fotos grandes a lo mejor no, en smf de hecho creo que se suben al servidor verdad?