ここでは、Oracle データベースの Lob 型のカラムの内容を FTP 転送するサンプルコードを掲載しています。
スポンサーリンク
Lob 型のデータを FTP 転送する
本サンプルでは、php://memory (または、php://temp) に対して LOB データをメモリ上に出力することで、Lob 型のデータを一旦ファイルへ出力することなく FTP 転送を行っています。詳細はサンプル中のコメントを参照ください。
// データベースへ接続する
$conn = oci_connect('user', 'password', 'dbname');
// LOB データを取得
$sql = 'select BLOB_DATA from table1';
$stmt = oci_parse($conn, $sql);
// sql の実行
oci_execute($stmt, OCI_NO_AUTO_COMMIT);
// 先頭のレコードのみ取得
$row = oci_fetch_array($stmt, OCI_ASSOC);
// blob データを取得
$blob_data = $row['BLOB_DATA'];
// デフォルト(2メガバイト)よりも大きなサイズの場合は以下のように
// php://temp を使用して、メモリの上限を変更することが可能である。
// ただし、上限を超える場合は、テンポラリファイルが使用される
$fp = fopen("php://memory", 'rwb');
// メモリの上限を変更し、上限を超えた場合にはテンポラリファイルが使用される
//$limit = 10 * 1024 * 1024; // 10メガバイトまで書き込みを許可する
//$fp = fopen("php://temp/maxmemory:$limit", 'rwb');
// LOBデータを メモリストリームに書き込む
while(!$blob_data->eof()) {
fwrite($fp, $blob_data->read(8192));
}
// ファイルポインタを先頭に戻す
rewind($fp);
// 接続を確立する
$conn_id = ftp_connect('127.0.0.1');
// ユーザ名とパスワードでログインする
$login_result = ftp_login($conn_id, 'user', 'password');
// FTP ファイル転送
if (ftp_fput($conn_id, 'remote_file', $fp, FTP_ASCII)) {
echo "Success";
} else {
echo "Failed";
}
// 接続を閉じ、ファイルを閉じる
ftp_close($conn_id);
// ステートメントの解放
oci_free_statement($stmt);
// データベースから切断
oci_close($conn);