Also remember that fread() will only parse the first 8192 bytes from the stream. Use..
<?php
$data = stream_get_contents($stream);
?>
.. if you have a larger output to parse.
PDO::pgsqlLOBOpen
(PHP 5 >= 5.1.2, PECL pdo_pgsql >= 1.0.2)
PDO::pgsqlLOBOpen — 既存のラージオブジェクトのストリームをオープンする
説明
resource PDO::pgsqlLOBOpen
( string $oid
[, string $mode
] )
PDO::pgsqlLOBOpen() は、oid が指すデータにアクセスするためのストリームをオープンします。 mode が r の場合、 ストリームは読み込み用にオープンされます。 mode が w の場合、 ストリームは書き込み用にオープンされます。 fread()、fwrite() および fgets() のような通常のファイルシステム関数を使用して、 ストリームの内容を操作することができます。
注意: この関数およびラージオブジェクトに対するすべての操作は、 トランザクション内で処理される必要があります。
パラメータ
- oid
-
ラージオブジェクトの ID。
- mode
-
モードが r の場合、読み込み用のストリームをオープンします。 モードが w の場合、書き込み用のストリームをオープンします。
返り値
成功した場合にストリームリソース、失敗した場合に FALSE を返します。
例
例1 PDO::pgsqlLOBOpen() の例
PDO::pgsqlLOBCreate() の例に引き続き、 このコード片はデータベースからラージオブジェクトを取得して それをブラウザに出力します。
<?php
$db = new PDO('pgsql:dbname=test host=localhost', $user, $pass);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->beginTransaction();
$stmt = $db->prepare("select oid from BLOBS where ident = ?");
$stmt->execute(array($some_id));
$stmt->bindColumn('oid', $lob, PDO::PARAM_LOB);
$stmt->fetch(PDO::FETCH_BOUND);
fpassthru($lob);
?>
参考
- PDO::pgsqlLOBCreate() - 新しいラージオブジェクトを作成する
- PDO::pgsqlLOBUnlink() - ラージオブジェクトを削除する
- pg_lo_open() - ラージオブジェクトをオープンする
PDO::pgsqlLOBOpen
knl at bitflop dot com
26-Sep-2008 03:54
26-Sep-2008 03:54
knl at bitflop dot com
26-Sep-2008 01:20
26-Sep-2008 01:20
The above example is missing some data. After spending several hours trying to get it to work in vain, Jeff Davis from the PostgreSQL channel on IRC (freenode) figured out what was missing.
The below example will work, but you have to insert the MIME type and file size of the large object that you are storing, so you can use that data for extraction.
<?php
$db = new PDO('pgsql:dbname=test host=localhost', $user, $pass);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->beginTransaction();
$stmt = $db->prepare("SELECT oid, blob_type, filesize FROM BLOBS WHERE ident = ?");
$stmt->execute(array($some_id));
$stmt->bindColumn('oid', $lob, PDO::PARAM_LOB);
$stmt->bindColumn('blob_type', $blob_type, PDO::PARAM_STR);
$stmt->bindColumn('filesize', $filesize, PDO::PARAM_STR);
$stmt->fetch(PDO::FETCH_BOUND);
$stream = $pdo->pgsqlLOBOpen($lob, 'r');
$data = fread($stream, $filesize);
header("Content-type: $blob_type");
echo $data;
?>
Also fpassthru() will just give this result: Warning: fpassthru(): supplied argument is not a valid stream resource in ...
Use echo or print instead.
