¡Ya estamos en Twitter!

Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad

Guardar imagenes en una base de datos

por Uriel Lizama

Introducción

Como parte de la despedida de eiial pues debido a razones personales se aleja de este mundo de la programación por un tiempo, nos ha dejado un código perl el cual convertí en un sencillo tutorial.

En este tutorial vamos a aprender a implementar un sencillo código para guardar imagenes en nuestro database las cuales más adelante podremos desplegar con ayuda de otro pequeño script.

La tabla

Lo primero que debemos de crear es la tabla en nuestra base de datos de la siguiente manera:

CREATE TABLE `subir_imagenes` (
`id` int(11) unsigned NOT NULL auto_increment,
`nombre` varchar(255) default NULL,
`tipo` varchar(255) default NULL,
`imagen` longblob NOT NULL,
KEY `id` (`id`)
) TYPE=MyISAM DEFAULT CHARSET=latin1

Vemos como la columna imagen la ponemos como longblob pero les recomiendo que cambien esto a blob si las imagenes que van a guardar son de tamaño pequeñas (menores a 70kb), si son menores a 16mb entonces usen mediumblob o de lo contrario dejenlo como esta.

Guardar las imagenes en el database

Vamos a crear un archivo perl al cual vamos a llamar guardar.pl donde pondremos el siguiente código:

#!/usr/bin/perl

use strict;
use CGI::Carp qw(fatalsToBrowser);
use DBI;
use CGI qw(param uploadInfo);

# Eial 2004 la versión orginial se encuentra en http://perlenespanol.com/foro en sector intermedio.

print "Content-type: text/html\n\n";

my $archivo = param('archivo');

if (length($archivo) > 0)

{

# Configurar la linea siguiente

my $m = DBI->connect('DBI:mysql:database=test;host=localhost','root','') or die('No se puede conectar con la base de datos');

my $nombre = param('nombre');

my $tipo = uploadInfo($archivo)->{'Content-Type'};

binmode($archivo);

my $imagen;

while (read($archivo,$_,1024)) {$imagen .= $_};

close($archivo);

if ($nombre)

{

if ($m->selectrow_array("SELECT nombre FROM subir_imagenes WHERE nombre='$nombre'"))

{

print 'El nombre de la imagen esta actualmente en uso';
exit;
}

}

$m->do("INSERT INTO subir_imagenes(nombre,tipo,imagen) VALUES(" . $m->quote($nombre) . ",'$tipo'," . $m->quote($imagen) . ")");

my $id = $m->selectrow_array("SELECT id FROM subir_imagenes WHERE id=LAST_INSERT_ID()");

$m->disconnect;

print <<HTML;
<html>
<body>
<p align="center">Se ha subido la imagen a la base de datos</p>
<br />
<p align="center">ID: $id</p>
<p align="center">Nombre: $nombre</p>
<br />
<center><p>Puede verla pulsando <a href="imagen.pl?id=$id">aquí</a></p></center>
</body>
</html>
HTML

}

else

{

print <<HTML;
<form enctype="multipart/form-data" method="post" action="$ENV{'SCRIPT_NAME'}">
Nombre: <input type="text" name="nombre" maxlength="256" /> (Opcional)
<br />
Archivo:  <input type="file" name="archivo" />
<br />
<input type="submit" />
</form>
HTML

}

exit;

Recuerden configurar la llamada al módulo DBI con los parametros correspondientes a su base de datos. Para mayores detalles checa el tutorial Como conectarte a tu database.

Llamando a la imagen

Ya que tenemos nuestras imagenes guardadas en nuestro database ahora debemos de crear un código para desplegar las imagenes. Para esto vamos a crear un archivo perl al cual vamos a llamar imagen.pl con el siguiente código:

#!/usr/bin/perl

use strict;
use CGI::Carp qw(fatalsToBrowser);
use DBI;
use CGI qw(param);

# Eial 2004 la versión orginial se encuentra en http://perlenespanol.com/foro en sector intermedio.

# Configurar la linea siguiente

my $m = DBI->connect('DBI:mysql:database=test;host=localhost','root','') or die('No se puede conectar con la base de datos');

my $id = param('id');

my $nombre = param('nombre');

my $datos = ($id) ? 'id=' . $m->quote($id) : 'nombre=' . $m->quote($nombre);

my $imagen = $m->selectrow_hashref("SELECT imagen,tipo FROM subir_imagenes WHERE " . $datos);

print ((${$imagen}{'tipo'}) ? "Content-type: ${$imagen}{'tipo'}\n\n" : "Content-type: text/html\n\nImagen inexistente o Tipo de dato no soportado");

binmode(STDOUT);

print ((${$imagen}{'tipo'}) ? ${$imagen}{'imagen'} : '');

exit;

Recuerda configurar nuevamente la linea donde se llama al módulo DBI para que tenga los parametros que corresponden a tu database.

Este archivo perl que acabamos de crear lo podemos ejecutar de dos maneras y dependen de como queremos llamar a nuestras imagenes:

  • Por nombre: Si queremos llamar nuestra imagen por su nombre entonces lo haríamos de esta manera: http://misitio.com/cgi-bin/imagen.pl?nombre=nombre_de_imagen
  • Por id: Si por el contrario quieres llamar la imagen por su id único, lo debes de hacer de la siguiente manera: http://misitio.com/cgi-bin/imagen.pl?id=1

Listo ya tenemos completo nuestros archivo y estamos preparados para guardar imagenes en nuestro database, ahora sólo queda de tu parte como utilizar este código.

Notas Finales

Para ver el post original de eiial con el código que se muestra aquí, lo pueden hacer en:
http://perlenespanol.com/foro/viewtopic.php?t=115

El código mostrado en este tutorial fue creado en un 100% por eiial y fue donado a "Perl en Español".


¿Quiéres más tutoriales como este? Escribir tutoriales toma una gran cantidad de tiempo y esfuerzo. Si este tutorial te ayudó a aprender o a solucionar algo, por favor considera dejar alguna donación en apoyo a Perl en Español.

Cliquea en el botón de abajo para dejar tu donación por medio de PayPal.

Comparte:
Categorías de Tutoriales:
En Nuestros Foros:

    Software error:

    junk after document element at line 1, column 32, byte 32 at /usr/lib64/perl5/vendor_perl/XML/Parser.pm line 187.
    

    For help, please send mail to the webmaster ([email protected]), giving this error message and the time and date of the error.

  • Entra a los foros »
Socializa:
Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Perl en Español es mantenido con Movable Type
Todo el contenido de Perl en Español está bajo una licencia CC:
Creative Commons License