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