000
14.10.2003, 22:07 Uhr
mike
Pinguinhüpfer (Operator)
|
Hi! PostgreSQL bietet die Möglichkeit, BLOBs (Binary Large Objects) einzufügen. Hierbei handelt es sich schlicht um eine simple File (MP3s, MPEGs, uvm.). PostgreSQL bietet inzwischen eigene Funktionen dafür an: lo_import, lo_export, lo_unlink. Diese Funktionen werden direkt vom postmaster verarbeitet, mit anderen Worten muss hier lokal – also am Server – gearbeitet werden.
Zu erstellen ist folgende Tabelle:
Code: |
CREATE TABLE public.tbldata ( produktid serial NOT NULL, blobtitle varchar(50) NOT NULL, blobdata oid NOT NULL, typ varchar(50) NOT NULL, filename varchar(50) NOT NULL, CONSTRAINT tbldata_pkey PRIMARY KEY (produktid) ) WITH OIDS;
|
Die Files müssen erstmal auf den Server gelangen. Hier bietet sich die in HTML vorgefertigte „file-Funktion“ an. Nach dem die Datei z.B. im /tmp Ordner (je nach apache Einstellung) gespeichert wurde, kann sie weiter verarbeitet werde.
PHP 4: |
<input type="file" name="probe" size="20"> <?php if(isset($Submit1)) { if (isset($_FILES['probe']) and ! $_FILES['probe']['error']) { $db = pg_Connect("host=localhost dbname=mainhm user=postgres password=XXX") or die ("ERROR: Die Datenbank ist nicht erreichbar");
chmod($_FILES['probe']['tmp_name'],0666); // Lese bzw. Schreibrechte setzen $query = "INSERT INTO tbldata (blobtitle,blobdata,filename,typ)"; $query .= " VALUES ($strDesc."',lo_import('"; $query .= $_FILES['probe']['tmp_name']."'),'".$_FILES['probe']['name']."', '"; $query .= $_FILES['probe']['type'].“’);"; $result = pg_Exec($query); pg_Close($db); } } ?>
|
strDesc ist ein simples Edit (type=text). Nun sollte die ausgewählte Datei gespeichert sein. Nun erfolgt das auslesen des BLOBs. Das ganze funktioniert jetzt genau in die entgegengesetzte Richtung. Das Problem ist, dass der Client bzw. der Server prinzipiell nur auf eine Frage „antwortet“. D.h. man muss sich wieder der HTML Funktionen bedienen und anhand des Content Types die Datei zum Download zur Verfügung stellen. Ich werde 2 verschiedene Wege zeigen: Der erste Weg wird ein Bild aus der DB laden (z.B. das Bild eines Produktes) – die zweite Variante zeigt einen simplen Download. Sample 1: In diesem BSP zeige ich ein im Link übergebenes Produkt-Bild an
PHP 4: |
$id = $_GET['produktid']; $db = pg_Connect("host=localhost dbname=mainhm user=postgres password=XXX") or die ("ERROR: Die Datenbank ist nicht erreichbar"); $result = pg_exec($db, "SELECT blobdata,typ,name FROM tbldata WHERE produktid= $id;");
$pic = pg_Fetch_Array($result, 0); header("Content-type: ".$pic["typ"]); $row = pg_fetch_row($result, 0);
pg_exec($db, "BEGIN"); $loid = pg_loopen($db, $row[0], "r");
pg_loreadall($loid); pg_loclose($loid);
pg_exec ($db, "COMMIT");
pg_Close($db); ?>
|
Aufgerufen kann es dann ganz bequem mit folgenden Source werden:
PHP 4: |
echo "<IMG SRC=’mypicblob.php?produktid=1'>";
|
Nun noch das aufrufen per Download:
PHP 4: |
<?php $id = $_GET['produktid']; $db = pg_Connect("host=localhost dbname=mainhm user=postgres password=XXX") or die ("ERROR: Die Datenbank ist nicht erreichbar"); $result = pg_exec($db, "SELECT blobdata,filename FROM tbldata WHERE produktid = $id;");
$file = pg_Fetch_Array($result, 0); $row = pg_fetch_row($result, 0);
header("Content-type: application/download"); header("Content-Disposition: attachment; filename=".$file['filename']); header("Content-Transfer-Encoding: binary"); pg_exec($db, "BEGIN"); $loid = pg_loopen($db, $row[0], "r"); pg_loreadall($loid); pg_loclose($loid); pg_exec ($db, "COMMIT"); pg_Close($db); ?>
|
Nun noch das Löschen des BLOBs. Zuerst erfolgt ein unlink und anschließend ein DELETE:
PHP 4: |
<?php $db = pg_Connect("host=localhost dbname=mainhm user=postgres password=XXX") or die ("ERROR: Die Datenbank ist nicht erreichbar"); $query = "SELECT lo_unlink (blobdata) FROM tbldata WHERE produktid=1;“; $result = pg_Exec($query); $query = "DELETE FROM tbldata WHERE produktid=1;“; $result = pg_Exec($query); pg_Close($db); ?>
|
Das war eigentlich. Viel Spass Mit freundlichen Grüßen mike --
Dieser Post wurde am 14.10.2003 um 22:13 Uhr von mike editiert. |