ZIPファイルを作成する方法

アフィリエイト広告を利用しています

このページの内容が役に立ったら X (旧twitter) でフォローして頂けると励みになります
挨拶や報告は無しで大丈夫です

AultaCMS では \aulta\utility\File::createZip() を使うことで、ZipArchive を利用した ZIP ファイルの作成処理を簡潔に実装できます。このサンプルでは、空ディレクトリの生成、テキストファイルの作成、さらにデータベースの内容に応じたファイル追加まで、一連の ZIP 生成処理を分かりやすく紹介します。

実務で「ダウンロード用の ZIP をまとめたい」「DB の内容に基づいてファイルを動的に追加したい」という場面でそのまま利用できます。

ZIPファイル作成のサンプルコード

// ZIPファイルを作成する場所
$path = __DIR__ . '/sample.zip';

// ZIPファイルを作成する
\aulta\utility\File::createZip($path, function (\ZipArchive $zip)
{
    // 空のディレクトリを追加
    $dirname = 'test_dir';
    $zip->addEmptyDir($dirname);

    // テキストファイルを追加
    $localname = 'readme.txt';
    $contents = 'ファイルの内容';
    $zip->addFromString($localname, $contents);

    // データベース
    $q = new \aulta\Query();
    $q->sql = 'SELECT * FROM sample WHERE status = :status';
    $q->params['status'] = '1';

    $q->eachResult(
        null,
        function($row) use ($zip) {

            if (empty($row['file_path'])) {
                continue;
            }

            $filename = \aulta\Config::app_dir_upload() . $row['file_path'];
            $localname = 'test_dir/' . $row['product_key'] . '_1' . '.' . $row['file_extension'];

            if (file_exists($filename)) {
                $zip->addFile($filename, $localname);
            }
        }
    );
});

// ファイルのダウンロード
$download_name = 'サンプル.zip';
\aulta\utility\File::sendFileZip($path, $download_name);
exit();

コードのポイント解説

1. ZIP の保存先を指定する

$path に ZIP の出力先ファイルパスを指定します。__DIR__ を使うと、現在の PHP ファイルと同じ階層に ZIP を生成できます。

2. createZip() 内で ZipArchive を操作する

AultaCMS の File::createZip() は、ZipArchive のインスタンスをコールバックへ渡す仕組みです。標準 API(addEmptyDir()addFromString()addFile())をそのまま利用できます。

3. データベースから取得したファイルを ZIP にまとめる

\aulta\Query() を使って対象レコードを取得し、ファイルが存在する場合のみ ZIP に追加しています。存在チェックは実務で重要なポイントです。

4. ZIP をダウンロードさせる

File::sendFileZip() に ZIP のパスとダウンロード時のファイル名を渡すだけで、ユーザーに ZIP を返すことができます。

実務で注意すべきポイント

  • ZIP に大量のファイルを追加すると処理時間が長くなる
  • 生成した ZIP は不要になったら削除してディスク容量を確保する
  • 日本語ファイル名は環境によって文字化けする可能性がある
  • DB 連動 ZIP の場合は file_exists() チェックが必須
  • アップロードディレクトリの読み取り権限に注意する

まとめ

AultaCMS の createZip()sendFileZip() を使えば、ZIP 作成からダウンロードまでをシンプルに実装できます。ディレクトリ作成、テキスト生成、DB 連動まで含むため、実務の ZIP 生成処理を一通りカバーしたサンプルです。