アップロードファイル(ZIP)を展開して保存 - PHP

興味があったので作ってみた。
pear使ってます。

HTTP_Uploadの拡張情報がtmpファイルに対応してないようなので、
アップロード→zipファイル保存→解凍
という流れ。
この例だとzipファイルを永久に溜め込んでしまうので、必要であれば某かの処理が必要。
HTTP_Uploadに頼らなければ、下のソースでいうUpload先は必要なくなる。
色々と面倒くさい部分は放置してますが、とりあえずこんな感じで。

<?php
require_once "HTTP/Upload.php";
require_once "phing/lib/Zip.php";

function zip_unpack($file,$zip_dir,$unpack_dir) {
	$zip_url = $zip_dir.$file;
	$zip_obj = new Archive_Zip($zip_url);
	$files_list_array = $zip_obj->listContent();
	
	$add_path_array = array('add_path' => $unpack_dir);
	$unpack = $zip_obj->extract($add_path_array);
	
	return $unpack;
	
	/*
	echo "<pre>";
	print_r($files_list_array);
	echo "</pre>";
	*/
}

// Upload先
$zip_dir = "./uploads/";
// 解凍先
$unpack_dir = "./zip/unpack/";


$upload = new HTTP_Upload("jp");
$file = $upload->getFiles("f");

if ($file->isValid()) {
	$moved = $file->moveTo("uploads/");
	if (!PEAR::isError($moved)) {
		echo "<p>ファイル ({$file->getProp('name')}) が uploads/ に移動されました。</p>";
		$zip_unpack = zip_unpack($file->getProp('name'),$zip_dir,$unpack_dir);
		if ($zip_unpack) {
			echo "<p>{$unpack_dir} に解凍されました。</p>";
		}
	} else {
		echo $moved->getMessage();
	}
} elseif ($file->isMissing()) {
	echo "ファイルがありません。";
} elseif ($file->isError()) {
	echo $file->errorMsg();
}

?>

<html>
<head>
	<title>Untitled</title>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>

<body>

<form name="fileuploadexample" method="POST" enctype="multipart/form-data" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']) ?>">
<input type="file" name="f" />
<input type="submit" name="submit" value="Submit" />
</form>

<?php

$dir = dir($unpack_dir);
while($file = $dir->read()) {
	$filename[] = $file;
}
$dir->close();

echo $unpack_dir." のファイルリスト:<br><hr>";

$count = count($filename);
for($i = 2;$i < $count;$i++) {
	print $filename[$i] . "<br>";
}
?>

</body>
</html>

かなり楽〜。
アップローダーに拡張したら便利でしょうね。
Viploaderに導入してほしい。

追記

ちなみに書庫が

Directory->File1,File2,File3

という構造だった場合、当然ながらディレクトリも生成されます。
格納するファイルによってはアップロードが失敗することがあります。原因は不明。