Manejar BLOBs en MySQL con Perl
Antes que nada hay que explicar lo que es un BLOB: Un BLOB es un tipo de datos SQL y su nombre viene de Binary Large OBject y teneis algo más de infromación en la Wikipedia.
Al principio me daba un poquillo de miedo atacar este tipo de datos y no estaba seguro de que fuera buena idea, pero después de ir leyendo por ahà (no encuentro ahora los links) me acabé convenciendo de que es una buena idea, primero porque te ahorras i-nodes, en lugar de usar un i-node por cada archivo usas un par de i-nodes para todos al estar en una base de datos. Y además con esto, y al ser archivos multimedia plenamente soportados en todos los sitemas operativos, esto hace más fácilmente portable la aplicación. Además de eso, resulta que es facilón.
Bueno, anem per feina.
Lo primero importar el módulo para manejar bases de datos en Perl, yo uso DBI con el DBD_MySQL y si necesitas saber el tipo del archivo como ocurre en mi caso puedes importar también el File::MMagic:
use DBI;
use File::MMagic;
Y suponemos que tenemos una base de datos con una tabla archivos tal que asÃ:
nombre VARCHAR(255) NOT NULL DEFAULT “”
tipo VARCHAR(50) NOT NULL DEFAULT “”
datos BLOB NOT NULL
Hecho esto continuo con el modo de insertar y hacer un update sobre un campo BLOB:
# Antes que nada nos conectamos a la base de datos
$conn = DBI->connect(”dbi:mysql:base_de_datos:servidor”, “usuario”, “contraseña”) or die “Lerele: $!”;
# Seguidamente abrimos el archivo, le sacamos las entrañas binarias y lo cerramos, después obtenemos el tipo de archivo
open($archivo, $nombre_archivo);
read($archivo, $las_entranyas, -s $archivo);
close($archivo);
$mm = new File::MMagic;
$tipo = $mm->checktype_filename($nombre_archivo);
# Después preparamos la sentencia sql y la lanzamos:
$conn->prepare(”INSERT INTO archivos (nombre, tipo, datos) VALUES(?, ?, ?)”)->execute($nombre_archivo, $tipo, $las_entranyas);
$conn->disconnect;
y es asà de sencillo, es igual para hacer un UPDATE.
En caso de querer obtener uno de los archivos y mostrarlos via web, como me ha tocado hacer en el trabajo, es sencillo igualmente. Supongamos que quieres obtener el archivo bocata_atun.jpg y mostrarlo en tu web, el programita quedarÃa una cosa asÃ, ojo que ni estoy controlando los posibles errores ni nada, ni siquiera uso un perl estricto, antes tampoco:
#!/usr/bin/perl
use DBI;
#notad que aquà no se usa el File::MMagic, ni falta que hace, ya tienes almacenado el tipo.
$nombre = “bocata_atun.jpg”;
$conn = DBI->connect(”dbi:mysql:basedatos:servidor”, “usuario”, “contraseña”);
$query = $conn->prepare(”SELECT tipo, datos FROM archivos WHERE nombre=’$nombre’”);
$query->execute;
($tipo, $datos) = $query->fetchrow_array;
$query->finish;
# Llega la hora de mostrar ese delicioso bocata de atún:
print< content-type: $tipo content-disposition: filename=$nombre
$datos EOT Ale es asà de sencillo, eso sà notad que entre la cabecera (los content-*) y los $datos hay un \n. Y yo sin haberlo probado antes.
This entry (Permalink) was posted
on Wednesday, February 14th, 2007 at 12:55 and is filed under Perl.
You can follow any responses to this entry through the RSS 2.0
feed.
You can leave a response
, or trackback
from your own site.


One Response to “Manejar BLOBs en MySQL con Perl”
February 14th, 2007 at 13:04
Manejar blobs de mysql en perl…
Micro-HOWTO donde se explica brevemente como manejar los tipos de datos BLOB de SQL….
Leave a Reply
You must be logged in to post a comment.