Just for the record, a user must be a superuser (database owner) in order to invoke pg_lo_open() (though pg_lo_create() may be invoked...). This opens a gigantic security hole in the db. If a user is not a superuser, db will raise an error with message "Can't create Large Object.".
Thus, imho, one should use pg_escape_bytea() instead.
pg_lo_open
(PHP 4 >= 4.2.0, PHP 5)
pg_lo_open — Otwiera wielki obiekt (Large Object - LO)
Opis
resource pg_lo_open
( resource
$connection
, int $oid
, string $mode
)
pg_lo_open() otwiera wielki obiekt (LO) i zwraca identyfikator
połączenia do niego. oid wskazuje poprawny identyfikator
wielkiego obiektu (LO), mode może przyjmować wartości "r" - odczyt,
"w" - zapis, lub "rw" odczyt/zapis. Funkcja zwraca FALSE w razie błędu.
Ostrzeżenie
Nie wolno zamykać połączenia z serwerem przed zamknięciem wszystkich wielkich obiektów.
Użycie interfejsu wielkich obiektów (LO) wymaga zamknięcia wszystkich operacji z nim związanych wewnątrz transakcji.
Informacja:
Ta funkcja była poprzednio nazwana pg_loopen().
Zobacz także pg_lo_close() i pg_lo_create().
metator at netcabo dot pt ¶
7 years ago
riccardo_ridenti at hotmail dot com ¶
10 years ago
//INSERT FILE INTO DB
$fp = fopen($filename,"r");
$buffer = fread($fp,filesize($filename));
fclose($fp);
pg_query ($conn, "begin");
$oid = pg_lo_create ($conn);
//echo "$oid\n";
$rs = pg_exec($conn,"insert into table(object) values($oid);");//object field type must be "oid"
$handle = pg_lo_open ($conn, $oid, "w");
//echo "$handle\n";
pg_lo_write ($handle, $buffer);
pg_lo_close ($handle);
pg_query ($conn, "commit"); //OR END
pg_close();
//GET BUFFER(file) FROM DB
$rs = pg_exec($conn,"select object from objects where id = xxxxxx;");
$row = pg_fetch_row($rs,0);
pg_query ($conn, "begin");
$loid = pg_lo_open($conn,$row[0], "r");
pg_lo_read_all ($loid);
pg_lo_close ($loid);
pg_query ($conn, "commit"); //OR END
pg_close();
