Ingeniuz :: Desarrollador web

domingo, mayo 29, 2005

¿Cómo almacenar una imagen en MySQL (SQL)?

Un amigo me preguntaba por email, cómo podría guardar las imágenes de su página web dentro de su base de datos mysql.
Aquí os pongo un trozo de código que puede ayudaros para esta tarea:

- Empezamos por la tabla que contendrá las imágenes:

Código:

CREATE TABLE imagenes (
id INT NOT NULL DEFAULT 0 auto_increment,
imagen LONGBLOB,
tipo VARCHAR(255),
PRIMARY KEY (id)
);


el campo "imagen" contendrá la imagen propiamente dicha (los datos binarios) y el campo "tipo" contendrá el tipo MIME que identifica el formato de la imagen (p. ej. image/gif).
Por supuesto esta tabla puede ser alterada, modificada, etc. para cubrir vuestras necesidades específicas.
El tipo de datos BLOB (BLOB, MEDIUMBLOB y LONGBLOB) es el usado por MySQL para almacenar datos binarios.

A continuación muestro un ejemplo de como almacenar una imagen en esta tabla que hemos creado:

Código:

// Abro el archivo de imagen para cargar sus contenidos
$archivo = 'images/foto01.jpg';

$fp = fopen ($archivo, 'r');
if ($fp){
$datos = fread ($fp, filesize ($archivo)); // cargo la imagen
fclose($fp);

// averiguo su tipo mime
$tipo_mime = 'image/jpeg';
$isize = imagesize ($archivo);
if ($isize)
$tipo_mime = $isize['mime'];

// La guardamos en la BD
$datos = base64_encode ($datos);
$sql = "INSERT INTO imagenes (imagen, tipo) VALUES ('$datos', '$tipo_mime');
$res = mysql_query($sql);
if (!$res)
echo "Error al ejecutar la consulta ($sql)\n";
}
else
echo "Error al abrir el archivo";



Para recuperar la imagen de la base de datos, el proceso que
tendríamos que seguir depende de cual queramos que sea el
resultado. Imaginemos que lo único que queremos es recuperar
la imagen de la base de datos y mostrarla en el navegador:

Código:

$id = intval ($_GET['id']); // imaginamos que el parámetro "id" nos llega en la URL (p. ej. imagen.php?id=5).
$sql = "SELECT imagen, tipo FROM imagenes WHERE id='$id'";
$res = mysql_query ($sql);
if ( $res AND mysql_num_rows($res)>0 ){ // se ha encontrado la imagen
$datos = mysql_fetch_array ($res);

// Indicamos al navegador el tipo de imagen que le vamos a enviar
header ('Content-type: ' . $datos['tipo']);

// Enviamos los datos binarios (la imagen)
echo base64_decode($datos['imagen']);
}
else
echo "Error al ejecutar la consulta ($sql)\n";


Bueno, espero que este código os ayude y ya sabeis, si teneis alguna duda o problema para ponerlo en práctica, estaré encantado de echaros una mano.

4 Comentarios:

  • Este comentario ha sido eliminado por un administrador del blog.

    Por Blogger Carmen Cortes, a las 9:10 p. m.  

  • Este comentario ha sido eliminado por un administrador del blog.

    Por Blogger Carmen Cortes, a las 9:10 p. m.  

  • Hola esto es muy interesante pero me gustaría saber si aplica tambien para archivos flash(.swf) no se si me podría ayudar... =) mi correo es camrina_cortes@msn.com

    Por Blogger Carmen Cortes, a las 9:11 p. m.  

  • Hola Carmen,

    efectivamente esto sirve para cualquier tipo de archivo binario (incluido los .swf).
    Tan sólo cambia en el tipo mime del archivo.
    En el caso de los swf, no puedes usar getimagesize, sino que directamente sabes que el tipo mime de los archivos swf es " application/x-shockwave-flash".
    Al mostrarlo al navegador, cambiariamos la línea:

    header ('Content-type: ' . $datos['tipo']);

    por esta otra:

    header ('Content-type: application/x-shockwave-flash');

    por lo demás es todo igual.
    No sé si es a lo que te referías.

    Por Blogger Manuel, a las 1:06 a. m.  

Publicar un comentario en la entrada

<< Inicio


 
Working on casas rurales / casas rurales & codigo postal & Salud y nutricion & tiendas + Padel, tiendas online