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
Views: Raw Message | Whole Thread | Download mbox | Resend email
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

Browse pgsql-es-ayuda by date

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