[PHP] zipファイルの中身を解凍させずに読み出す方法

2018年10月17日

PHP テクノロジー プログラミング

WEBサービスを作っていると時たまzipファイルをコントロールしなければいけない場合があります。 通常のやり方であれば、任意のフォルダに一時的に解凍して、処理が終わったら一時データを削除するというだけでいいのですが、削除の手間も面倒臭いという人にうってつけのスニペットを紹介します。

概要

今回紹介するプログラムは大きく2つの機能を持っています。
1. zipファイルの内容ファイル一覧を表示する機能 2. zipファイルに格納押されている任意のテキストファイルの呼び出し
ググってみると一時解凍するものしか出てこなかったので作って見ました。

環境条件

サーバーはlinuxOSを使うのが望ましいです。 phpが動作しているサーバーで"unzip"モジュールがインストールされている必要があります。 バージョンなどは特に気にしなくても大体の環境で動作すると思いますが、もし動作しない場合は、若干の手直しをするだけで動くでしょう。 (いいかげんですみません)

ソースコード

<?php namespace readZip; class proc{ // zipファイルの内部リスト表示 public static function getLists($zipPath){ if(!is_file($zipPath)){return;} unset($res); exec("unzip -l ".$zipPath ." | awk '{print $4}'" , $res); if(count($res) > 6){ $res = array_splice($res , 4,-2); sort($res); return json_encode($res , JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); } else{ return null; } } // 内部ファイルの中身を取得 public static function getData($zipPath , $filePath){ if(!is_file($zipPath)){return;} unset($res); exec("unzip -p ".$zipPath ." ". $filePath , $res); return join("\n",$res); } }

簡単解説

リスト呼び出しも、ファイルデータ呼び出しも、unzipコマンドを実行した返り値をreturnさせているだけなので、大したプログラムではないことがわかるでしょう。 zipファイルの容量にもよりますが、一般的なテキストファイルの圧縮データぐらいであれば、非常に高速に動くことがわかると思います。

使い方

簡単に使い方がわかるindex.phpを用意してみました。 <?php require_once "readZip.php"; // リスト表示 var_dump(\readZip\proc::getLists("data.zip")); // テキストデータ表示 var_dump(\readZip\proc::getData("data.zip","data/file-1.txt")); readZip.phpを読み込んで、それぞれのzipファイル名や、内包テキストファイル名(一覧表示したものから取得するのがいいでしょう)を引数に関数を叩いてあげるだけで、結果が返ってきます。 # php index.php string(494) "[ "__MACOSX/", "__MACOSX/data/", "__MACOSX/data/._tool-1957451_1280.jpg", "__MACOSX/data/._wallet-2292428_1280.jpg", "__MACOSX/data/._woman-1540802_1280.jpg", "__MACOSX/data/._woman-3096899_1280.jpg", "__MACOSX/data/._woofer-1885354_1280.png", "data/file-1.txt", "data/index.html", "data/tool-1957451_1280.jpg", "data/wallet-2292428_1280.jpg", "data/woman-1540802_1280.jpg", "data/woman-3096899_1280.jpg", "data/woofer-1885354_1280.png" ]" string(11) "aaa bbb ccc" リストは、配列をjson形式に変換して返しています。 文字列は、そのままreturnしているので、値として受け取れます。 いかがですか?コマンドラインって非常に高機能なため、phpと組み合わせるとかなり高速処理ができる&処理を簡素化することができる。 という事に気がつきましたか? このクラスには、あと画像表示機能をつけたら、漫画データなどを一時解凍なしで表示することができるようになるので、便利な図書館アプリなどを作ることも可能になりますね。 アイデアは無限大!!

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。