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($itmp, filesize($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
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!
ahi te he respondido, no le pulse al boton reply y se me fue en otro comentario 😛
vicram10
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?