Skip site navigation (1) Skip section navigation (2)

Problemas para mostrar un campo bytae o oid como imagen en postgres

From: Nestor Rodriguez <nestor(dot)njrz(at)gmail(dot)com>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Problemas para mostrar un campo bytae o oid como imagen en postgres
Date: 2011-07-12 20:53:33
Message-ID: 4E1CB44D.1040509@gmail.com (view raw or flat)
Thread:
Lists: pgsql-es-ayuda
Que tal amigos de Postgres soy nuevo en esta lista.

Estoy teniendo un pequeño problema al mostrar el contenido de un campo 
tipo bytea.

Quizas me puedan ayudar.

Para insertar la imagen hago lo siguiente :

# Verificamos que el formulario no ha sido enviado aun
$postback = (isset($_POST["enviar"])) ? true : false;
# Concexión a la base de datos
$link = pg_connect("host=$dbhost user=$dbuser password=$dbpwd 
dbname=$dbname") or die(pg_last_error($link));

if ($postback) {
     # Variables del archivo
     $type = $_FILES["archivo"]["type"];
     $tmp_name = $_FILES["archivo"]["tmp_name"];
     $size = $_FILES["archivo"]["size"];
     $nombre = basename($_FILES["archivo"]["name"]);

     # Contenido del archivo
     $fp = fopen($tmp_name, "rb");
     $buffer = fread($fp, filesize($tmp_name));
     fclose($fp);

     # Descripción de la foto
     $desc = $_POST["desc"];

     $isoid = $_POST['tipo'] == 'oid' ? true : false;

     if (!$isoid) {
         # Escapa el contenido del archivo para ingresarlo como bytea
         $buffer = pg_escape_bytea($buffer);
         $sql = "INSERT INTO foo(nombre, descripcion, archivo_bytea, 
mime, size)
                             VALUES ('$nombre', '$desc', 
'$buffer'::bytea, '$type', $size)";
     } else {
         # Inicia una transacción
         pg_query($link, "begin");
         # Crea un objeto blob y retorna el oid
         $oid = pg_lo_create($link);
         $sql = "INSERT INTO foo(nombre, descripcion, archivo_oid, mime, 
size)
             VALUES ('$nombre', '$desc', $oid, '$type', $size)";
     }
     # Ejecuta la sentencia SQL
     pg_query($link, $sql) or die(pg_last_error($link));
     if ($isoid) {
         # Abre el objeto blob
         $blob = pg_lo_open($link, $oid, "w");
         # Escribe el contenido del archivo
         pg_lo_write($blob, $buffer);
         # Cierra el objeto
         pg_lo_close($blob);
         # Compromete la transacción
         pg_query($link, "commit");
     }
     $msg = "Archivo guardado";
}

Hasta aqui todo tranquilo, inserta los bytae asi como los oid, pero 
cuando intento mostrarlo no sale nada o sale un mensaje que dice que "no 
se puede mostrar la imagen << >> porque tiene errores".

Aqui les muestro el codigo para mostra la imagen que uso.

     # Recupera el id pasado como par�metro
     $id=isset($_REQUEST['id'])?$_REQUEST['id']:0;
     include_once "sitedefs.php";
     # Conexi�n a la base de datos
     $link = pg_connect("host=$dbhost user=$dbuser password=$dbpwd 
dbname=$dbname") or die(pg_last_error($link));
     # Recupera el archivo en base al ID
     $sql = "select id, nombre, descripcion, mime, size, 
coalesce(archivo_oid,-1) as archivo_oid,
     coalesce(archivo_bytea,'-1') as archivo_bytea from foo where id=$id";
     $result=pg_query($link, $sql);
     # Si no existe, redirecciona a la p�gina principal
     if(!$result || pg_num_rows($result)<1){
         header("Location: index.php");
         exit();
     }
*   # Recupera los atributos del archivo*
     $row=pg_fetch_array($result,0);
     pg_free_result($result);
     # Para determinar si archivo a bajar fue ingresado al campo 
archivo_oid (es de tipo "oid")
     $isoid=false;
     if($row['archivo_bytea']==-1) $isoid=true;
     if($row['archivo_oid']==-1) $isoid=true;
     if($row['archivo_bytea']==-1 && $row['archivo_oid']==-1) die('No 
existe el archivo para mostrar o bajar');
     if($isoid){
         # Inicia la transacción
         pg_query($link, "begin");
         # Abre el objeto blob
         $file=pg_lo_open($link, $row['archivo_oid'], "r");
     }
     else{
         # Hace el proceso inverso a pg_escape_bytea, para que el 
archivo esta en su estado original
         $file=pg_unescape_bytea($row['archivo_bytea']);
     }
*    # Envio de cabeceras*
     header("Cache-control: private");
     header("Content-type: $row[mime]");
     header("Content-length: $row[size]");
     header("Expires: ".gmdate("D, d M Y H:i:s", mktime(date("H")+2, 
date("i"), date("s"), date("m"), date("d"), date("Y")))." GMT");
     header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
     header("Cache-Control: no-cache, must-revalidate");
     header("Pragma: no-cache");

     if($isoid){
         # Imprime el contenido del objeto blob
         pg_lo_read_all($file);
         # Cierra el objeto
         pg_lo_close($file);
         # Compromete la transacción
         pg_query($link, "commit");
     }
     else{
         # Imprime el contenido del archivo
         print stripslashes($file);
     }
     pg_close($link);

Espero me puedan ayudar, gracias!!

P.D.: e buscado en google y probado con otros ejemplos, de echo este 
codigo lo saque de internet, pero nada me resulta entonces recurro a 
ustedes.

In response to

pgsql-es-ayuda by date

Next:From: KernelDate: 2011-07-13 12:49:00
Subject: Alta disponibilidad
Previous:From: Miguel Angel Hernandez MorenoDate: 2011-07-12 20:36:27
Subject: Re: scripts pgpool-II

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group