記載された情報が古くなっている可能性がございますので十分ご注意ください。
PHPで指定したディレクトリ(サブディレクトリも全て)をZIPで圧縮するプログラム。
考慮するポイントは以下の2点
- 書庫内のルートディレクトリを指定できる
- ディレクトリごと(サブディレクトリも全て)圧縮できる
- ZIPファイルをファイルとして保存しないで、バイナリストリームとして扱える
上記を満たすライブラリとして、「Class: Create ZIP File」を選択した。
※ダウンロードにはユーザ登録が必要
「CreateZipFile.inc.php」のメソッドの動きが変なので、少々書き換えました
public function zipDirectory($dirName, $outputDir) {
if (!is_dir($dirName)){
trigger_error("CreateZipFile FATAL ERROR: Could not locate the specified directory $dirName", E_USER_ERROR);
}
$tmp=$this->parseDirectory($dirName);
$count=count($tmp);
$this->addDirectory($outputDir); ←削除
for ($i=0;$i<$count;$i++){
$fileToZip=trim($tmp[$i]);
$newOutputDir=substr($fileToZip,0,(strrpos($fileToZip,'/')+1)); ←削除
$newOutputDir = $outputDir.str_replace($dirName, '', $fileToZip); ←追加
$outputDir=$outputDir.$newOutputDir; ←削除
$fileContents=file_get_contents($fileToZip);
$this->addFile($fileContents,$newOutputDir);
}
}
ZIP圧縮してダウンロードさせるためのコード
require_once("CreateZipFile.inc.php");
$createZip = new CreateZipFile;
$createZip->zipDirectory(圧縮するディレクトリ, 書庫内のルートディレクトリ);
header( "Content-Type: application/octet-stream" );
header( "Content-disposition: attachment; filename=".ダウンロードするZIPファイル名 );
$zip_buffer = $createZip->getZippedfile();
print $zip_buffer;
※addFileメソッドで単一のファイルも追加できるよ









