phpでzipファイルを作成する

掲題の通りphpでzipファイルを作成するにはどうすればいいかを取り上げます。

標準サポートされている

特に追加のインストールなどは必要ありません。公式マニュアルを確認すると5.2以降では標準で利用可能なZipArchiveというAPIが存在します。

こちらを利用することで簡単にzipファイルの作成ができます。

ただwindowsのエクスプローラやmacのFinderなんかのGUIでファイルを操作するAPIとは、若干構造が異なり癖があるので一度理解する必要があります。GUI系を操作しているときなんかはディレクトリを作成して、その中にzipしたいファイルを詰め込んでからディレクトリに対して圧縮するみたいなイメージとなります。

ZipArchiveのAPIではディレクトリを事前に作成する必要もないですしzip化したい実際のファイルを移動する必要もありません。作成したいzipファイルのパスを指定して、zipしたいファイルに関してはその時点で存在しているファイルパスを指定して行く形になります。

サンプル

簡単なサンプル実装を下記に示します。

$za         = new \ZipArchive();
$tmpZipPath = "/tmp/test.zip";

if ($za->open($tmpZipPath, \ZipArchive::CREATE) === false) {
    throw new IllegalStateException("failed to create zip file. ${tmpZipPath}");
}

$zipFileImage = "/tmp/sample-image.jpg";
$zipFilePdf   = "/tmp/sample-pdf.pdf";

$za->addFile($zipFileImage, "zipped-image.jpg");
$za->addFile($zipFilePdf, "zipped-pdf.pdf");

if ($za->close() === false) {
    throw new IllegalStateException("failed to close zip file. ${tmpZipPath}");
}

phpでは先程簡単に述べたように ZipArchive というAPIを利用します。zip関数という関数群を利用して同様の機能を実装可能ですが過去のAPIですのでクラスベースの実装が普及している昨今ではZipArchiveクラスを用いるほうが良いでしょう。

ZipArchiveを使用した実装は下記のようになります

インスタンスを作成する

コンストラクタには特に何も指定する必要はありません。

zipファイルを作成する

zipファイルを作成するために open メソッドを呼び出します。このときに第一引数は作成したいzipファイルのパスとなります。またzipファイルが存在しないファイルを作成したい場合は第二引数に ZipArchive::CREATE 定数を指定します。その他オプションに関しては必要であれば公式マニュアルを参照してください。このメソッドはzipファイルの作成に失敗した場合falseを返却するので必要に応じて例外処理を実装するのが良いでしょう。

zipするファイルを指定する

zipにファイルを追加するには addFile メソッドを呼び出します。第一引数にローカルディスク上に存在するファイルのパスを指定します。また第二引数にはzipに追加された際に使用されるファイル名を指定します。解答した場合には第二引数で指定したファイル名になります。

zipファイルを閉じる

最後にzipファイルを閉じるために close メソッドをコールします。このメソッドは失敗した場合 false を返却するのでopenと同様にして必要に応じて例外処理を実装するのが良いでしょう。

まとめ

ZipArchiveのAPIはシンプルで特に複雑なところもないので実装するにはお手軽に利用できます。ただこのAPIに限ったことではないですがphpは手続き指向的な側面が大きいので少しもっさりした実装になってしまうのはしょうがないですね。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください