│ │192.168.1.1 ┏┷┓ ┃ ┃ ┃ ┃WEB example1 ┃ ┃ ┗┯┛ │192.168.2.1 │ │192.168.2.2 ┏┷┓ ┃ ┃ ┃ ┃DB example2 ┃ ┃ ┗┯┛ │
[postgres@example2 postgres]$ createdb object_test CREATE DATABASE [postgres@example2 postgres]$ psql object_test Welcome to psql 8.0.3, the PostgreSQL interactive terminal. Type: \copyright for distribution terms \h for help with SQL commands \? for help with psql commands \g or terminate with semicolon to execute query \q to quit object_test=# CREATE TABLE object_test( --ラージオブジェクトのテーブル object_test(# data_cd integer, --コード object_test(# object oid, --オブジェクト object_test(# fname text, --ファイル名 object_test(# type text, --タイプ object_test(# size integer --サイズ object_test(# ); CREATE TABLE object_test=# REVOKE ALL ON TABLE object_test FROM PUBLIC; REVOKE object_test=# GRANT SELECT, INSERT, DELETE, UPDATE ON object_test TO nobody; GRANT object_test=# ALTER TABLE ONLY object_test ADD CONSTRAINT object_test_pkey PRIMARY KEY (data_cd); NOTICE: ALTER TABLE / ADD PRIMARY KEY will create implicit index "object_test_pkey" for table "object_test"ALTER TABLE object_test=# \q テーブルの中身。 CREATE TABLE object_test( --ラージオブジェクトのテーブル data_cd integer, --コード object oid, --オブジェクト fname text, --ファイル名 type text, --タイプ size integer --サイズ ); REVOKE ALL ON TABLE object_test FROM PUBLIC; GRANT SELECT, INSERT, DELETE, UPDATE ON object_test TO nobody; ALTER TABLE ONLY object_test ADD CONSTRAINT object_test_pkey PRIMARY KEY (data_cd);
スクリプトは、 /home/example/public_htmlに設置する。 ダウンロードするファイルを展開する場所は、 /home/example/public_html/download ownerとpermissionを変更します。 [root@example1 root]# chown nobody.nobody /home/example/public_html/download [root@example1 root]# chmod 770 /home/example/public_html/download apacheの実行ユーザが、nobodyの場合です。 圧縮したデータはそのまま残るので、cronで削除するかスクリプトの最後に削除したほうが いいと思います。 db.incの中身。データベースに接続してます。 <?php $DBconnect = pg_connect('host=192.168.2.2 dbname=object_test port=5432 user=nobody'); ?> ob_compress.phpの中身。compress.phpから呼出してファイルをダウンロードします。 <?php if(!empty($_GET['dl_filename'])){ $dl_filename = $_GET['dl_filename'].".zip"; $dl_filename = mb_convert_encoding($dl_filename, "SJIS", "EUC"); $filename = "/home/example/public_html/download/"."$dl_filename"; header("Content-disposition: attachment; filename=$dl_filename"); header("Content-type: application/octet-stream; name=$dl_filename"); $fp = fopen($filename, "r"); echo fread($fp, filesize($filename)); fclose($fp); } ?> compress.phpの中身 <?php //DB定義 require_once "db.inc"; function compress_list(){ global $DBconnect; //データ取得 //SQL生成 $sql = ""; $sql = $sql . "SELECT "; $sql = $sql . "data_cd,object,fname,type,size "; $sql = $sql . "FROM "; $sql = $sql . "object_test ORDER BY data_cd "; $result = pg_query($DBconnect, $sql); //表示 echo "<table border=1><tr>"; echo "<td nowrap></td>"; echo "<td nowrap>番号</td>"; echo "<td nowrap>oid</td>"; echo "<td nowrap>ファイル名</td>"; echo "<td nowrap>ファイルタイプ</td>"; echo "<td nowrap>ファイルサイズ</td>"; echo "</tr>"; for($i = 0; $i < pg_num_rows($result); $i++){ $data_cd = pg_fetch_result ( $result, $i, 'data_cd'); echo "<tr>"; echo "<td><input type=checkbox name=comp[] value=$data_cd></td>"; echo "<td>". $data_cd ."</td>"; echo "<td>". pg_fetch_result ( $result, $i, 'object') ."</td>"; echo "<td>". pg_fetch_result ( $result, $i, 'fname') ."</td>"; echo "<td>". pg_fetch_result ( $result, $i, 'type') ."</td>"; echo "<td>". pg_fetch_result ( $result, $i, 'size') ."</td>"; echo "</tr>"; } echo "</table>"; } //テンポラリディレクトリ作成用ディレクトリ $tmp_dir = '/home/example/public_html/download/'; if(($_POST['status'] == 'compress') && (is_array($_POST['comp']))){ //初期化 $comp_cd = ""; //テンポラリディレクトリ作成。 $comp_dir= $tmp_dir.time(); mkdir($comp_dir, 0770); //ラージオブジェクトをテンポラリディレクトリに展開する $data_count = count($_POST['comp']); //開始 pg_query($DBconnect, "BEGIN"); for($i =0 ; $i < $data_count; $i++){ $comp_cd = $_POST['comp'][$i]; //ファイル名の初期化 $comp_dir_fname = ""; //oid抽出 $sql = ""; $sql = $sql . "SELECT "; $sql = $sql . "object,fname "; $sql = $sql . "FROM "; $sql = $sql . "object_test where data_cd = '$comp_cd' "; $result = pg_query($DBconnect, $sql); $comp_oid = pg_fetch_result ( $result, 0, 'object'); $comp_fname = pg_fetch_result ( $result, 0, 'fname'); $comp_fname = mb_convert_encoding($comp_fname, "SJIS", "EUC"); $comp_dir_fname = $comp_dir."/".$comp_fname; //ラージオブジェクト抽出 pg_lo_export($comp_oid, "$comp_dir_fname"); } //終了 pg_query($DBconnect, "COMMIT"); pg_close($DBconnect); //圧縮命令 $compress_dir = $comp_dir."/"; $commpress_order = "/usr/bin/zip -r -j $comp_dir $compress_dir"; //ファイルを圧縮 exec($commpress_order); //ファイルをダウンロード $dl_filename = substr($comp_dir,-10); $url = "https://192.168.1.1/~example/ob_compress.php?dl_filename=$dl_filename"; echo "<a href=\"$url\">"."$url"."</a>"; } ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> <title>ラージオブジェクト・一括圧縮ダウンロード</title> </head> <body> <font color=blue><h3>ラージオブジェクト・一括圧縮ダウンロード</h3></font> <hr> <form name="data" action="compress.php" method="post"> <? if($_POST['status'] == ''){compress_list();} ?> <input type="hidden" name="status" value="compress"> <input type="submit" value="Submit"> </form> </body> </html>