概要
PHP で Zip ファイルをテンポラリディレクトリに展開して中身のファイルをごにょごにょするのが地味にめんどくさかったのでメモがてらまとめました。
テンポラリディレクトリに展開先を用意する
Zip ファイルの展開先として一時的なディレクトリを使用したかったためsys_get_temp_dir
メソッドを使いました。
/tmp
など OS が指定する一時的なファイルの置き場所へのパスを取得することができます。
加えてuniqid
メソッドで取得する一意な値をディレクトリ名とするようにしてみました。
$tmpDir = sys_get_temp_dir() . '/' . uniqid();
mkdir($tmpDir); // ディレクトリを作成します
このようにテンポラリディレクトリに展開するようにしておけば、展開後に処理が落ちてしまい削除が漏れしてしまった場合でも後で迷いなく削除することができます。
※OS によっては一定期間経つとテンポラリディレクトリのファイルが削除される設定になっているものもあるようです
Zip ファイルの展開
ZipArchive
という Zip を扱うクラスを使います。
※環境によってはインストールが必要なようですが私の環境ではデフォルトで使えました
$tmpDir = sys_get_temp_dir() . '/' . uniqid();
mkdir($tmpDir);
$zip = new ZipArchive();
$zip->open($filePath); // 展開したい zip ファイルを指定します
$zip->extractTo($tmpDir); // 展開先のディレクトリを指定します
$zip->close();
このようにすればテンポラリディレクトリに Zip ファイルが展開されているはずですので後は煮るなり焼くなり好きにしましょう!
おまけ
私が今回使ったファイル名を扱うメソッドを備忘録を兼ねて紹介しておきます。
PHP 公式のドキュメント見たほうが早そうですが参考までに ※ドキュメントへのリンクもつけておきます
ファイル名取得
パターンに合ったファイルパスを取得します。フルパスが取得されます。
正規表現は使えませんが、以下のように書けばあるディレクトリの拡張子が txt のみのファイルのみ取得できるので便利です。
$files = glob("/hoge/*.txt");
例えば以下のようなディレクトリの構造だった場合は、
/hoge/a.txt
/hoge/b.txt
/hoge/c.log
以下のような配列が取得されます。
$files = [
'/hoge/a.txt',
'/hoge/b.txt',
];
特定の拡張子のみ取得したい場合はたまにあるので使えそうです。
ファイルパスのパース
glob
メソッドを使ってまとめてファイルパスを取得したものの以下のようなパターンもあると思います。
- 実際に使用するのはファイル名だけなのでパスは除いて抜き出したい
- 拡張子も削りたい
そういうときはpathinfo
メソッドがファイルパスをパースした連想配列を返してくれるので便利です。
$filePath = '/hoge/a.txt';
$pathinfo = pathinfo($filePath);
// 以下のような連想配列が取得できます
[
[dirname] => /hoge,
[basename] => a.txt,
[extension] => .txt,
[filename] => a,
];
フラグを指定すれば連想配列ではなく、指定した要素だけを取得することも可能です。
$filePath = '/hoge/a.txt';
// 'a.txt' のみが返ります
$pathinfo = pathinfo($filePath, PATHINFO_BASENAME);
上記と同じことをしてくれるbasename
メソッドがあるためお好みで。
感想
素の PHP のメソッドを使ってファイル操作をしましたがpathinfo
のような気の利いたメソッドもあれば、ディレクトリが空でないと使えないrmdir
などもあり歴史を感じました。