PHPからフォルダ構成ごとzip圧縮
phpでフォルダ構成ごとzip圧縮しないといけない用件がありまして、それで色々調べた結果をメモしておきます。
ZipArchiveクラスを使う方法(自分的には非推奨)
前提 : PHP5.2以上
http://www.php.net/manual/ja/class.ziparchive.php
でもこのZipArchiveクラスで圧縮する場合、フォルダごと圧縮ということは出来ないみたいです。
圧縮するファイル追加ならあるんですが、圧縮するフォルダ追加とかがないんですよね・・・。
なので無理やりするとしたら
addFile(圧縮対象のファイルパス, [ファイル名]) 圧縮するファイルを追加
addEmptyDir(ディレクトリ名) 圧縮ファイルに新しいディレクトリを作成
フォルダ構成を調べて addEmptyDirでディレクトリを作成後→addFileでそのディレクトリに追加という処理が必要になります。
<?php // ZIPファイルのフォルダ構成 // |-test.txt // |-test.jpg // |-test2 // |-test2.txt $zip = new ZipArchive(); if ($zip->open('archive.zip', ZipArchive::CREATE) === true) { $zip->addFile('test.txt'); $zip->addFile('test.jpg'); $zip->addEmptyDir("test2"); $zip->addFile('test2.txt','test2/test2.txt'); $zip->close(); } else { exit('open error.'); } ?>
上記の処理はめんどう・・・・と思って他の方法を探したところ
PHPで Linuxコマンドを使う方法
この方法だと、フォルダごと圧縮 が出来るので一発です。
下記は自分が作った簡単なサンプルソースです。
<?php // zipファイル名 $fileName = "zipFile"; // 圧縮対象フォルダ $compressDir = "/var/www/html/ZipTest/test/"; // zipファイル保存先 $zipFileSavePath = "/var/www/html/ZipTest/"; // コマンド // cd:ディレクトリの移動 // zip:zipファイルの作成 $command = "cd ". $compressDir .";". "zip -r ". $zipFileSavePath . $fileName .".zip ."; // Linuxコマンドの実行 exec($command); // 圧縮したファイルをダウンロードさせる。 header('Pragma: public'); header("Content-Type: application/octet-stream"); header("Content-Disposition: attachment; filename=".$fileName.".zip"); readfile("/var/www/html/ZipTest/".$fileName.".zip"); ?>