このエントリーをはてなブックマークに追加

更新日: 2016年2月25日

実行時間: 0.0224

CI_Zip

 「CI_Zip」ライブラリクラスは、ファイルシステム上のファイル、または、プログラム上のデータを zipフォーマットでアーカイブし圧縮します。

 zipアーカイブされたデータは、ファイルシステムに保存したり、HTTPレスポンスとしてクライアントに
ダウンロードさせることができます。また、データとして取得しプログラム内で再利用することも可能です。

CI_Zipのロード

 「CI_Loader」クラスの「library()」メソッドでロードします。
 「CI_Zip」クラスに必要な設定項目はありません。  従って、ロードする際に第二引数に設定情報を指定する必要はありません。

    $this->load->library('zip');

データからZipアーカイブ生成

 プログラム上のデータからZipアーカイブデータを生成します。

add_data($filepath, $data = NULL);

 第一引数にZipアーカイブに含めるファイルパスを指定します。
 ファイルパスは実際にファイルシステム上にある必要はありません。もし、ファイルシステム上にファイルが存在しても そのファイルがデータとして利用されることはありません。
 あくまで、アーカイブ上のファイルパスであり、解凍した際にこのファイルパスでファイルが展開されます。

 第二引数は、Zipアーカイブに含めるデータを指定します。
Zipアーカイブ内で第一引数で指定したファイルパスとしてのデータとなります。

    $this->load->library('zip');

    $this->zip->add_data('data/sample.txt', 'Sample Text Data.');

add_dir($directory)

 Zipアーカイブ内に空のディレクトリを作成します。

    $this->load->library('zip');

    $this->zip->add_dir('tmp_dir');

add_data() ・ add_dir() のバグ

 本来、「add_data()」メソッドと「add_dir()」メソッドでは、実際のファイルシステム上の ファイルパスは関係ないのですが、「CI_Zip」クラスのバグにより、指定されたファイルパスのファイルまたは、 ディレクトリから、Zipアーカイブに含めるファイル情報の「mtime」を取得しようとします。

 もし、指定したファイルパスが実際のファイルシステム上に存在する場合、そのファイル、または、ディレクトリの 「mtime」情報を取得しようとしますが、更に悪いことに、正しい情報を取得しません。

 したがって、Zipアーカイブを解凍すると、誤った「mtime」情報で展開されてしまいます。

ファイルシステムからZipアーカイブ生成

 実際のファイルシステム上のファイルからデータを読み込みデータをZipアーカイブします。

read_file($path, $preserve_filepath = FALSE) 一番上に戻る

 第一引数に、Zipアーカイブに含めるファイルパスを指定します。 ファイルパスはドキュメントルートからの相対パス、または、絶対パスです。
 第二引数には、第一引数で指定されたファイルパスのディレクトリパスをZipアーカイブ内で保持するかの指定です。 TRUEを指定するとディレクトリパスを保持します。 FALSEを指定するとディレクトリパスは削除され、Zipアーカイブ内ではカレント ディレクトリとしてファイルが作成されます。

  • ディレクトリパス削除
  • $this->load->library('zip');

    $this->zip->read_file('images/logo.png');
    $this->zip->archive('../tmp/images_logo.zip');
    $ unzip -l images_logo.zip
    Archive:  images_logo.zip
      Length     Date   Time    Name
     --------    ----   ----    ----
       109827  05-15-12 15:29   logo.png
     --------                   -------
       109827                   1 file
    
  • ディレクトリパス保持
  • $this->load->library('zip');

    $this->zip->read_file('images/logo.png', TRUE);
    $this->zip->archive('../tmp/images_logo.zip');
    $ unzip -l images_logo.zip
    Archive:  images_logo.zip
      Length     Date   Time    Name
     --------    ----   ----    ----
       109827  00-00-48 00:00   images/logo.png
     --------                   -------
       109827                   1 file
    

read_dir($path, $preserve_filepath = TRUE) 一番上に戻る

 第一引数で指定されたディレクトリ配下のファイル・ディレクトリを再帰的にZipアーカイブに追加していきます。

 第二引数には、第一引数で指定されたディレクトリの親ディレクトリパスをZipアーカイブ内に 保持するか削除するか指定します。TRUEを指定すると親ディレクトリパスは保持されます。 FALSEを指定すると、親ディレクトリパスは削除されます。

    $this->load->library('zip');

    $this->zip->read_dir('images/', TRUE);
    $this->zip->archive('../tmp/images_dir.zip');
    $ unzip -l images_dir.zip
    Archive:  images_dir.zip
      Length     Date   Time    Name
     --------    ----   ----    ----
       109827  00-00-48 00:00   images/logo.png
        17777  00-00-48 00:00   images/menu.png
          318  00-00-48 00:00   images/icon/aaa.png
     --------                   -------
       127922                   3 file
    
    $this->load->library('zip');

    $this->zip->read_dir('images/', FALSE);
    $this->zip->archive('../tmp/images_dir.zip');
    $ unzip -l images_dir.zip
    Archive:  images_dir.zip
      Length     Date   Time    Name
     --------    ----   ----    ----
       109827  00-00-48 00:00   logo.png
        17777  00-00-48 00:00   menu.png
          318  00-00-48 00:00   icon/aaa.png
     --------                   -------
       127922                   3 file
                        

read_file() ・ read_dir() のバグ 一番上に戻る

 読み込んだファイルの「mtime」情報が正しく取得されません。
 したがって、Zipアーカイブを解凍すると、誤った「mtime」情報で展開されてしまいます。

Zipアーカイブデータの出力

 「add_data()」「add_dir()」「read_file()」「read_dir()」メソッドで生成したZipアーカイブデータは、 下記で示す処理を行うことができます。

    • データとして取得
    • ファイルシステムに保存
    • HTTPレスポンスでクライアントに出力する

get_zip() 一番上に戻る

 Zipアーカイブデータをデータとして取得します。
 データを加工したり、データベースに保存する場合などに利用します。

    $this->load->library('zip');

    $this->zip->read_dir('images/', TRUE);
    $zip_data = $this->zip->get_zip();

    $b64 = base64_encode($zip_data);

archive($filepath) 一番上に戻る

 Zipアーカイブデータをファイルシステムに保存します。
 引数には保存するファイルパスをドキュメントルートからの相対パス、または、絶対パスで指定します。

 保存するファイルパスはWebサーバの書込み権限が必要です。

    $this->load->library('zip');

    $date = date('Y-m-d');
    $this->zip->read_dir('../data/', FALSE);
    $this->zip->archive('../backup/data_' . $date . '.zip');

download($filename = 'backup.zip') 一番上に戻る

 ZipアーカイブデータをHTTPレスポンスでクライアントにダウンロードさせます。
 引数には、ダウンロードファイルとしてのファイル名を指定します。

 「download()」メソッドは、自動でHTTPヘッダ(Content-Type:など)を適切に処理した後、 クライアントに出力します。 そのため、ユーザは特別に「CI_Output」クラスなどで出力処理をを行う必要はありません。

 「download()」メソッドは、データを出力した後「exit()」をコールするため 「download()」メソッド以降の処理は行われないので注意してください。

    $this->load->library('zip');

    $date = date('Y-m-d');
    $this->zip->read_dir('../data/', TRUE);
    $this->zip->download('data_' . $date . '.zip');

clear_data() 一番上に戻る

 Zipアーカイブデータを初期化して空にします。

 「add_dir()」「add_data()」「read_file()」「read_dir()」メソッドは、実行されるたびに データを追加キャッシュしていきます。そして、「get_zip()」「archive()」または、
「download()」メソッドが実行されるとキャッシュされたデータからZipアーカイブデータを生成します。
 そのため、新たに別のZipアーカイブデータを生成する場合は、一度キャッシュをクリアする
必要があります。

    $this->load->library('zip');

    $this->zip->add_data('sample_aaa.txt', 'AAA');
    $this->zip->add_data('sample_bbb.txt', 'BBB');
    $this->zip->add_data('sample_ccc.txt', 'CCC');
    $this->zip->archive('../backup/sample.zip');

    $this->zip->clear_data();

    $this->zip->add_data('sample_ddd.txt', 'DDD');
    $this->zip->add_data('sample_eee.txt', 'EEE');
    $this->zip->add_data('sample_fff.txt', 'FFF');
    $this->zip->archive('../backup/sample2.zip');