Categorías
Programacion PHP

Guardar una imagen en la Base de Datos (mysql)

[ads1]A continuacion mostraremos una sencilla forma de como realizar la subida de imagenes a nuestra base de datos y no a nuestro servidor.
guardar bd imagen1 - Guardar una imagen en la Base de Datos (mysql)

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

[highlight]
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 ;
[/highlight]

Archivo index.php

[highlight]
<?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>';
}
?>
[/highlight]

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.

[highlight]
<?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'];
}
?>
[/highlight]

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

guardar bd imagen2 - Guardar una imagen en la Base de Datos (mysql)

Por Victor Ramirez

Soy un analista de sistemas informáticos apasionado por la tecnología y navegante de internet desde el 2007. Mi experiencia en el campo de la informática me ha permitido adquirir habilidades y conocimientos relevantes en áreas como programación, seguridad informática, redes y comunicaciones, bases de datos y tecnologías de la información en general.

Mi pasión por la tecnología me impulsa a estar al tanto de las últimas tendencias en el campo de la informática y me motiva a explorar nuevas tecnologías. Como analista de sistemas, estoy acostumbrado a trabajar en proyectos complejos y tengo habilidades para resolver problemas técnicos.

6 respuestas a «Guardar una imagen en la Base de Datos (mysql)»

¡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!

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

¡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

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..

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?

Deja una respuesta