LoginSignup
1
0

More than 1 year has passed since last update.

PHP で Zip ファイルをテンポラリディレクトリに展開する

Posted at

概要

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 公式のドキュメント見たほうが早そうですが参考までに ※ドキュメントへのリンクもつけておきます

ファイル名取得

https://www.php.net/manual/ja/function.glob

パターンに合ったファイルパスを取得します。フルパスが取得されます。

正規表現は使えませんが、以下のように書けばあるディレクトリの拡張子が 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などもあり歴史を感じました。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0