ZipArchiveクラスを使用したファイル圧縮・解凍平成30年 12月 5日 作成

00165

概略

PHP5.2以降で使用可能となった「ZipArchiveクラス」を利用してファイル圧縮・解凍を行える様に。

手段

「ZipArchiveクラス」を使用。

実装方法

ファイルの圧縮(zipファイル作成)手順

  • インスタンス後、ZIPファイルをオープン(作成)する。
  • 圧縮したいファイルをオープン(作成)したZIPファイルに追加・圧縮をする。

ファイルの解凍手順

  • インスタンス後、ZIPファイルをオープンする。
  • 指定した解凍先ディレクトリにファイルが解凍される。

jpgファイル2点を圧縮する例を記述。

<?php
	// 判定用フラグ
	$flag = 0;
	
	// ファイル名に付加する為の現在時刻取得
	$time = date("YmdHis");
	
	// 圧縮するファイルの配列
	$files = array("sample_01.jpg", "sample_02.jpg");
	
	// 保存するZIPファイル名
	$filename = "パスを含む任意のファイル名-".$time.".zip";
	
	// インスタンス
	$obj_zip = new ZipArchive();
	// ZIPファイルをオープン 「ZipArchive::CREATE」アーカイブが存在しない場合に作成
	$result = $obj_zip->open($filename, ZipArchive::CREATE);
	
	// zipファイルのオープンに成功した場合 失敗した場合にはエラーコードを返す
	if($result === true){
		foreach($files as $file){
			// 日本語ファイル名等により文字化けする場合の対策
			// $file = mb_convert_encoding($file, "sjis", "utf-8");
			$file = "ファイルパス".$file;
			//「addFile」ファイルを追加
			if(!$obj_zip->addFile($copy_to)){
				$flag = 1;
			}
			
			/*
			▼ ファイルをコピー後に圧縮する場合 ▼
			// 圧縮時のフォルダ構造を変えたい場合等に便利?
			$file = mb_convert_encoding($file, "sjis", "utf-8");
			$copy_to = "../../file_data/".$file;
			copy("../../img/content/sample/".$file, $copy_to);
			if(!$obj_zip->addFile($copy_to)){
				$flag = 1;
			}
			▲ ファイルをコピー後に圧縮する場合 ▲
			*/
		}
		// ZIPファイルをクローズ
		$obj_zip->close();
		
		/*
		▼ ファイルをコピー後に圧縮した場合 ▼
		// コピーファイルを削除 close()の後に削除する
		foreach($files as $file){
			unlink("../../file_data/".$file);
		}
		▲ ファイルをコピー後に圧縮した場合 ▲
		*/
	}else{
		echo 'Error Code:'.$result;
		$flag = 1;
	}
	if($flag == 0){
		echo 'zipファイルの作成に成功しました';
	}else{
		echo 'zipファイルの作成に失敗しました';
	}
?>

上記で作成した圧縮ファイルを解凍する。

<?php
	// 判定用フラグ
	$flag = 0;
	
	// ZIPファイル
	$filename = "ファイル名を含むファイルパス";
	// 解凍先ディレクトリ
	$to = "ディレクトリ名";
	// インスタンス
	$obj_zip = new ZipArchive();
	// ZIPファイルをオープン
	$result = $obj_zip->open($filename);
	
	if($result === true){
		// ZIPファイル内の全てのファイルを指定した解凍先に展開する
    	$obj_zip->extractTo($to);
		$obj_zip->close();
	}else{
		echo 'Error Code:'.$result;
		$flag = 1;
	}
	if($flag == 0){
		echo 'zipファイルの解凍に成功しました';
	}else{
		echo 'zipファイルの解凍に失敗しました';
	}
?>

ファイルを解凍せず中身を確認する方法

<?php
	$flag = 0;
	// ZIPファイル
	$filename = "ファイル名を含むファイルパス";
	// 解凍先ディレクトリ
	$to = "ディレクトリパス";
	// インスタンス
	$obj_zip = new ZipArchive();
	// ZIPファイルをオープン
	$result = $obj_zip->open($filename);
	
	if($result === true){
		// ファイル数をカウント
		$num_files = $obj_zip->numFiles;
		for($i=0;$i<$num_files;$i++){
			// インデックスを使用してエントリの詳細情報を取得
			$stat = $obj_zip->statIndex($i);
			// name情報のみを取得
			$names[] = $stat['name'];
	    }
 		$obj_zip->close();
	}else{
		echo 'Error Code:'.$result;
		$flag = 1;
	}
	if($flag == 0){
		print_r($names);
	}else{
		echo 'zipファイルの展開に失敗しました';
	}
	
	// 結果
	Array
	(
		[0] => パス/sample_01.jpg
		[1] => パス/sample_02.jpg
	)
?>

考察

ZipArchiveクラスを使用するにあたっては、phpクラス・オブジェクトについての知識がないと少し理解しづらいかもしれない。

複数の画像が表示されているwebページにて、フォームのチェックボックス等からの送られてきたファイルをまとめて圧縮する等で活用が見出せそう。

最後までお読み下さり ありがとうございました。記事はここ迄です。

尚、本記事は作成から「5年以上」経過しています。

記事作成当時と現在の状況等により内容が適切でない場合があります。また、リンク切れが生じている場合もあります事を予めご了承下さい。

お気に入りに登録しますとお気に入り記事を一元管理でき、再度閲覧したい場合等 容易に記事を探し出す事ができますのでご活用下さい。

下段にはコメントを掲載しております。

広告バナー

コメント

頂いたコメントを下記に掲載しております。更に下部にはコメント投稿フォームを設けております。

注意事項を確認・了承した上、コメント投稿お願いいたします。

注意事項に該当するコメントにつきましては、事前告知なしに投稿したコメントの削除を行う場合があります。

予めご了承下さい。

  • 記事内容と無関係なコメント
  • 公序良俗に反するコメント
  • 個人情報や法令違反を含むコメント
  • その他、管理者が不適切と判断したコメント

現在 頂いているコメントはありません

返信先(コメント管理番号)コメントに対し返信する場合のみ
お名前・ハンドルネーム2~32文字内で入力下さい
メールアドレス公開される事はありません
電話番号半角数字+ハイフンで入力下さい
コメント全角500文字内で入力下さい