Recuperar BLOB vía PHP con Postgresql

Como algunos ya saben estoy llevando un proyecto web para una firma de abogados en donde el objetivo principal es la digitalización y organización de todos los casos que ha llevado el bufete en sus diez años de labores legales, es de suma importancia que el sistema resguarde los documentos legales los organize y lleve las actividades y registros de todos los nuevos casos legales que entran a la firma, en un post anterior ya habíamos visto unas rutinas de como hacer para cargar los archivos y registros a la base de datos de Postgresql ( respaldando los archivos en forma duple [FS&BLOB] ); el caso es que luego de buscar por Internet me di cuenta que existen muy pocas personas que implementan esta tecnología con archivos, la mayoría aplica este enfoque para gestionar las imágenes ( almacenar y desplegar imágenes  ya sea en catálogos, inventarios, existen ejemplos de todo en Internet.  En la universidad llevaba un proyecto similar pero el código se extravió y básicamente había que hacer el trabajo de nuevo. PHP ha cambiado mucho desde ese entonces y las sentencias y rutinas ya no son iguales. En fin veamos el escenario nuevamente, tenemos una BD en Postgresql en esa BD tenemos una tabla y dentro de la tabla hay un cambo tipo OID en ese campo almacenamos los blobs ; es decir los archivos los cuales los cargamos con aquel formulario web y rutina PHP que ya les había mostrado, que esta aquí . Ahora lo que queremos es recuperar ese archivo almacenado allí y esculpirlo al navegador para que el usuario pueda acceder a el. Veamos el código.

{code type=PHP}
header(“Content-Type: application/pdf”);
$idc=$_GET[‘idc’];
$clave=$_GET[‘clave’];
$connstr = ” host=’127.0.0.1′ port = ‘5432’ dbname=’lcrodril_sistema’ user=’lcrodril_sql’ password=’xxxxxxxxxxx’ ” ;
$dbh = pg_connect($connstr);
if ($dbh) {
}
$sqlvista= “SELECT * from casos where id=’$idc’AND key=’$clave'”;
$stat2 = pg_exec($sqlvista);

if ($stat2) {
$vistaso = pg_numrows($stat2);
for ($i = 0; $i < $vistaso; $i++) {
$data = pg_fetch_row($stat2, $i);
pg_exec($dbh, “BEGIN”);
$ofp = pg_lo_open($data[14], “r”);
if (!$ofp) {
echo “cannot open BLOB”;
}
$img = pg_lo_read_all($ofp);
echo $img;
pg_lo_close($ofp);
pg_exec($dbh, “END”);
}
}
else {
echo “DATOS INCORRECTOS”;
}
{/code}

Algo muy importante acá es la cabecera (HEADER) debe estar arriba, al principio del documento PHP esto para evitar errores de valga la redundancia de cabeceras si no se coloca el navegador no entiende que se supone que es la data que la base de datos esta entregando y solo se desplegaran un montón de caracteres aleatorios que obviamente no son útiles, lo segundo es que en este caso particular requiero de unas variables (ID y clave) que provienen de la URL que precede a este código las traspaso de la siguiente forma:

{code type=PHP}
echo “<p> Obtenga su expediente legal <a href=’recupera.php?idc=$idc&amp;clave=$clave’> aquí </a><p>”;
{/code}

Entonces de esta forma la sentencia SQL que recupera la data en este caso el archivo PDF sabe cual tupla y celda seleccionar y escupe el archivo apropiadamente al navegador. El código puede mejorarse en los aspectos de entrega, pero tal cual como esta hace el trabajo perfectamente si alguien lo aplica y lo mejora avíseme para actualizarlo. Saludos a todos y espero les sirva este código. See you on the net!

Leave a Comment