zip形式でアーカイブされた複数の画像ファイルをPHPを使って特定の画像ファイルを取り出しウェブブラウザに表示してみたいと思います。
ソース
<?php
$baseDir = "./archives";
if (!isset($_GET['name'])){
return;
}
$name = htmlspecialchars($_GET["name"]);
$file = $baseDir . DIRECTORY_SEPARATOR . $name;
if (!isset($_GET["pageNo"])) {
$zip = new ZipArchive;
if ($zip->open($file)) {
for($i=0;$i < $zip->numFiles;$i++){
echo ($zip->getNameIndex($i) . "\n");
}
$zip->close();
}
}
else {
$page = "";
$pageNo = htmlspecialchars($_GET["pageNo"]);
$zip = new ZipArchive;
if ($zip->open($file)) {
$i = intval($pageNo);
$page = $zip->getNameIndex($i);
$zip->close();
}
if ($page == "") {
return;
}
$url = 'zip://' . dirname(__FILE__) . '/archives/' . $name . '#' . $page;
$ext = pathinfo($page, PATHINFO_EXTENSION);
if ($ext == "png") {
$im = imagecreatefrompng($url);
header('Content-Type: image/png');
imagepng($im);
imagedestroy($im);
}
elseif ($ext == "gif") {
$im = imagecreatefromgif($url);
header('Content-Type: image/gif');
imagegif($im);
imagedestroy($im);
}
elseif ($ext == "jpg") {
$im = imagecreatefromjpeg($url);
header('Content-Type: image/jpeg');
imagejpeg($im);
imagedestroy($im);
}
}
?>
使い方
zipファイルの保存場所はphpスクリプトのディレクトリ下のarchivesディレクトリを参照します。
ウェブブラウザで”http://サーバー名/read.php?name=zipファイル名”とアクセスするとzipファイルにアーカイブされたファイルの一覧が表示されます。
同じく”http://サーバー名/read.php?name=zipファイル名&pageNo=数値”で画像が表示されます。
感想
以前からPHPでzipファイル内の画像を表示させたいと思っていたのですが、テンポラリディレクトリに画像を展開する方法だと、常時展開されることになってディスクスペースを多量に使うことに成ります。
最近調べたところphpのzipファイルをディスクに展開するのではなく、読み出しようのストリームを取得する方法を見つけましたので、試してみました。
スクリプトの作りはフォームにしてもAPIにしても中途半端な作りですが、とりあえず思った通りの動きはしてくれました。
今後こちらを呼び出すUIを作ろうと思いますが、サーバーサイド(PHP)で組むと画像の呼び出しで結構時間が掛かるので、クライアント側からJavaScriptを使い非同期で画像を呼び出すように作る方が良さそうです。
コメント