db.inc,compress.php,ob_compress.phpの3ファイルで構成する。
スクリプトは、
/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>