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