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 生成処理を一通りカバーしたサンプルです。