:: El Monstruillo wARfeando ::

Manejar BLOBs en MySQL con Perl

February 14th, 2007

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.

Posted in Perl | 1 Comment »