Zip 類別

CodeIgniter 的 Zip 類別可以讓你產生 Zip 壓縮檔。 壓縮檔可以下載到你的電腦或是存放在目錄內。

使用 Zip 類別

初始化類別

就像 CodeIgniter 其它多數類別一樣,Zip 類別可以在你的 controller 內透過 $this->load->library 函式來初始化:

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

載入之後,就可以這樣取得 Zip 物件:

$this->zip

使用範例

這個範例示範了如何壓縮一個檔案,並將其儲存在伺服器的目錄內,再下載到你的電腦。

$name = 'mydata1.txt';
$data = 'A Data String!';

$this->zip->add_data($name, $data);

// 將 zip 檔案寫入到伺服器的目錄內,命名為 "my_backup.zip"
$this->zip->archive('/path/to/directory/my_backup.zip');

// 將檔案下載到你的電腦,命名為 "my_backup.zip"
$this->zip->download('my_backup.zip');

類別參考資料

class CI_Zip
$compression_level = 2

要使用的壓縮等級。

範圍為 0 到 9,9 是最高壓縮等級,而 0 是不壓縮:

$this->zip->compression_level = 0;
add_data($filepath[, $data = NULL])
Parameters:
  • $filepath (mixed) – 單一檔案路徑,或是一個陣列,裡面包含了 檔案 => 內容 資料對
  • $data (array) – 檔案內容(若 $filepath 是陣列則忽略)
Return type:

void

將資料加進 Zip 壓縮檔。可以運作在單一檔案或多檔案模式。

當加入單一檔案時,第一個參數必須包含你想使用的檔案名稱,而第二個參數必須包含檔案內容:

$name = 'mydata1.txt';
$data = 'A Data String!';
$this->zip->add_data($name, $data);

$name = 'mydata2.txt';
$data = 'Another Data String!';
$this->zip->add_data($name, $data);

當加入多個檔案時,第一個參數必須含有 檔案 => 內容 資料對,而且第二個參數將被忽略:

$data = array(
        'mydata1.txt' => 'A Data String!',
        'mydata2.txt' => 'Another Data String!'
);

$this->zip->add_data($data);

如果你希望將壓縮檔內的資料放在子目錄內,只要將路徑加到檔案名稱內即可:

$name = 'personal/my_bio.txt';
$data = 'I was born in an elevator...';

$this->zip->add_data($name, $data);

上面的範例會將 my_bio.txt 放進名為 personal 的子目錄內。

add_dir($directory)
Parameters:
  • $directory (mixed) – 目錄名稱,或是一個陣列,裡面包含多個目錄
Return type:

void

讓你能夠加入目錄。 通常這個方法是不必要的,因為你可以在使用 $this->zip->add_data() 時將資料放進目錄中, 但如果你想創建一個空目錄時可以這樣做:

$this->zip->add_dir('myfolder'); // 建立一個空目錄 "myfolder"
read_file($path[, $archive_filepath = FALSE])
Parameters:
  • $path (string) – 檔案路徑
  • $archive_filepath (mixed) – 新的檔案名稱/路徑字串,或是布林值決定是否維持原來路徑
Returns:

成功時回傳 TRUE,失敗時回傳 FALSE

Return type:

bool

讓你能夠壓縮伺服器上現有的檔案。 提供一個檔案路徑,然後 zip 類別就可以讀取並加入壓縮檔:

$path = '/path/to/photo.jpg';

$this->zip->read_file($path);

// 下載壓縮檔到你的電腦,命名為 "my_backup.zip"
$this->zip->download('my_backup.zip');

如果你希望 Zip 壓縮檔能維持檔案原本的目錄結構, 就在第二個參數傳入 TRUE (boolean):

$path = '/path/to/photo.jpg';

$this->zip->read_file($path, TRUE);

// 下載壓縮檔到你的電腦,命名為 "my_backup.zip"
$this->zip->download('my_backup.zip');

在上面的例子,photo.jpg 將會被放進 path/to/ 目錄中。

你也可以為新加入的檔案指定一個新路徑:

$path = '/path/to/photo.jpg';
$new_path = '/new/path/some_photo.jpg';

$this->zip->read_file($path, $new_path);

// 下載壓縮檔,裡面含有 /new/path/some_photo.jpg
$this->zip->download('my_archive.zip');
read_dir($path[, $preserve_filepath = TRUE[, $root_path = NULL]])
Parameters:
  • $path (string) – 檔案路徑
  • $preserve_filepath (bool) – 是否維持原本路徑
  • $root_path (string) – 在壓縮檔內要排除掉的部份路徑
Returns:

成功時回傳 TRUE,失敗時回傳 FALSE

Return type:

bool

讓你能夠壓縮伺服器上現有的目錄。 給予目錄的路徑,zip 類別就會讀取目錄內所有子目錄及檔案並加入壓縮檔。:

$path = '/path/to/your/directory/';

$this->zip->read_dir($path);

// 下載壓縮檔到你的電腦,命名為 "my_backup.zip"
$this->zip->download('my_backup.zip');

預設情況下 Zip 壓縮檔會放進第一個參數路徑上的所有目錄。 如果你希望忽略目標目錄上層的路徑, 可以在第二個參數使用 FALSE (boolean)。例如:

$path = '/path/to/your/directory/';

$this->zip->read_dir($path, FALSE);

這將會產生含有一個目錄 “directory” 的壓縮檔,內含相對應的所有子目錄, 但不會含有 /path/to/your 這部份的路徑。

archive($filepath)
Parameters:
  • $filepath (string) – 目標壓縮檔的路徑
Returns:

成功時回傳 TRUE,失敗時回傳 FALSE

Return type:

bool

將壓縮檔寫到伺服器上的目錄中。 請提供一個有效的伺服器路徑做為檔案名稱。 並確保目錄是可寫的(通常使用755即可)。範例:

$this->zip->archive('/path/to/folder/myarchive.zip'); // 建立一個叫做 myarchive.zip 的檔案
download($filename = 'backup.zip')
Parameters:
  • $filename (string) – 壓縮檔名稱
Return type:

void

讓壓縮檔開始從伺服器下載。 你必須提供這個壓縮檔下載時的名稱。例如:

$this->zip->download('latest_stuff.zip'); // 檔案將下載為 "latest_stuff.zip"

Note

在你呼叫這個方法時,不要在 controller 裡面顯示任何資料。 因為它會送出數個標頭(headers),並讓資料被當成二進位檔案。

get_zip()
Returns:壓縮檔內容
Return type:string

回傳壓縮後的檔案資料。 一般而言你不會需要這個方法,除非你想對資料做些特別的事情:

$name = 'my_bio.txt';
$data = 'I was born in an elevator...';

$this->zip->add_data($name, $data);

$zip_file = $this->zip->get_zip();
clear_data()
Return type:void

Zip 類別將會快取你的壓縮檔資料,以避免每次呼叫上列方法時都要重新壓縮。 然而,若你需要建立數個壓縮檔,每個包含不同的資料時, 你可以在每個步驟之間清除這些快取資料。例如:

$name = 'my_bio.txt';
$data = 'I was born in an elevator...';

$this->zip->add_data($name, $data);
$zip_file = $this->zip->get_zip();

$this->zip->clear_data();

$name = 'photo.jpg';
$this->zip->read_file("/path/to/photo.jpg"); // 讀取檔案內容

$this->zip->download('myphotos.zip');