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.

Responder a