Zip 编码类

CodeIgniter 的 Zip 编码类允许你创建 Zip 压缩文档,文档可以被下载到你的桌面或者 保存到某个文件夹里。

使用 Zip 编码类

初始化类

正如 CodeIgniter 中的其他类一样,在你的控制器中使用 $this->load->library()方法来初始化 Zip 编码类:

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

初始化之后,Zip 编码类的对象就可以这样访问:

  1. $this->zip

使用示例

下面这个例子演示了如何压缩一个文件,将其保存到服务器上的一个目录下,并下载到你的桌面上。

  1. $name = 'mydata1.txt';
  2. $data = 'A Data String!';
  3.  
  4. $this->zip->add_data($name, $data);
  5.  
  6. // Write the zip file to a folder on your server. Name it "my_backup.zip"
  7. $this->zip->archive('/path/to/directory/my_backup.zip');
  8.  
  9. // Download the file to your desktop. Name it "my_backup.zip"
  10. $this->zip->download('my_backup.zip');

类参考

  • _class _CI_Zip
    • $compression_level = 2
    • 使用的压缩等级。

压缩等级的范围为 0 到 9 ,9 为最高等级,0 为禁用压缩:

  1. $this->zip->compression_level = 0;
  • adddata($filepath[, $data = NULL_])

参数:

  1. - **$filepath** (_mixed_) -- A single file path or an array of file => data pairs
  2. - **$data** (_array_) -- File contents (ignored if $filepath is an array)返回类型:

void

向 Zip 文档中添加数据,可以添加单个文件,也可以添加多个文件。

当添加单个文件时,第一个参数为文件名,第二个参数包含文件的内容:

  1. $name = 'mydata1.txt';
  2. $data = 'A Data String!';
  3. $this->zip->add_data($name, $data);
  4.  
  5. $name = 'mydata2.txt';
  6. $data = 'Another Data String!';
  7. $this->zip->add_data($name, $data);

当添加多个文件时,第一个参数为包含 file => contents 这样的键值对的数组,第二个参数被忽略:

  1. $data = array(
  2. 'mydata1.txt' => 'A Data String!',
  3. 'mydata2.txt' => 'Another Data String!'
  4. );
  5.  
  6. $this->zip->add_data($data);

如果你想要将你压缩的数据组织到一个子目录下,只需简单的将文件路径包含到文件名中即可:

  1. $name = 'personal/my_bio.txt';
  2. $data = 'I was born in an elevator...';
  3.  
  4. $this->zip->add_data($name, $data);

上面的例子将会把 my_bio.txt 文件放到 personal 目录下。

  • adddir($directory_)

参数:

  1. - **$directory** (_mixed_) -- Directory name string or an array of multiple directories返回类型:

void

允许你往压缩文档中添加一个目录,通常这个方法是没必要的,因为你完全可以使用 $this->zip->add_data()方法将你的数据添加到特定的目录下。但是如果你想创建一个空目录,你可以使用它:

  1. $this->zip->add_dir('myfolder'); // Creates a directory called "myfolder"
  • readfile($path[, $archivefilepath = FALSE])

参数:

  1. - **$path** (_string_) -- Path to file
  2. - **$archive_filepath** (_mixed_) -- New file name/path (string) or (boolean) whether to maintain the original filepath返回:

TRUE on success, FALSE on failure返回类型:bool

允许你压缩一个已经存在于你的服务器上的文件。该方法的参数为一个文件路径,Zip类会读取该文件的内容并添加到压缩文档中:

  1. $path = '/path/to/photo.jpg';
  2.  
  3. $this->zip->read_file($path);
  4.  
  5. // Download the file to your desktop. Name it "my_backup.zip"
  6. $this->zip->download('my_backup.zip');

如果你希望 Zip 文档中的文件保持它原有的目录结构,将第二个参数设置为布尔值 TRUE 。例如:

  1. $path = '/path/to/photo.jpg';
  2.  
  3. $this->zip->read_file($path, TRUE);
  4.  
  5. // Download the file to your desktop. Name it "my_backup.zip"
  6. $this->zip->download('my_backup.zip');

在上面的例子中,photo.jpg 文件将会被放在 path/to/ 目录下。

你也可以为新添加的文件指定一个新的名称(包含文件路径):

  1. $path = '/path/to/photo.jpg';
  2. $new_path = '/new/path/some_photo.jpg';
  3.  
  4. $this->zip->read_file($path, $new_path);
  5.  
  6. // Download ZIP archive containing /new/path/some_photo.jpg
  7. $this->zip->download('my_archive.zip');
  • readdir($path[, $preservefilepath = TRUE[, $root_path = NULL]])

参数:

  1. - **$path** (_string_) -- Path to directory
  2. - **$preserve_filepath** (_bool_) -- Whether to maintain the original path
  3. - **$root_path** (_string_) -- Part of the path to exclude from the archive directory返回:

TRUE on success, FALSE on failure返回类型:bool

允许你压缩一个已经存在于你的服务器上的目录(包括里面的内容)。该方法的参数为目录的路径,Zip类会递归的读取它里面的内容并重建成一个 Zip 文档。指定目录下的所有文件以及子目录下的文件都会被压缩。例如:

  1. $path = '/path/to/your/directory/';
  2.  
  3. $this->zip->read_dir($path);
  4.  
  5. // Download the file to your desktop. Name it "my_backup.zip"
  6. $this->zip->download('my_backup.zip');

默认情况下,Zip 文档中会保留第一个参数中指定的目录结构,如果你希望忽略掉这一大串的树形目录结构,你可以将第二个参数设置为布尔值 FALSE 。例如:

  1. $path = '/path/to/your/directory/';
  2.  
  3. $this->zip->read_dir($path, FALSE);

上面的代码将会创建一个 Zip 文档,文档里面直接是 "directory" 目录,然后是它下面的所有的子目录,不会包含 /path/to/your 路径在里面。

  • archive($filepath)

参数:

  1. - **$filepath** (_string_) -- Path to target zip archive返回:

TRUE on success, FALSE on failure返回类型:bool

向你的服务器指定目录下写入一个 Zip 编码文档,该方法的参数为一个有效的目录路径,后加一个文件名,确保这个目录是可写的(权限为 755 通常就可以了)。例如:

  1. $this->zip->archive('/path/to/folder/myarchive.zip'); // Creates a file named myarchive.zip
  • download($filename = 'backup.zip')

参数:

  1. - **$filename** (_string_) -- Archive file name返回类型:

void

从你的服务器上下载 Zip 文档,你需要指定 Zip 文档的名称。例如:

  1. $this->zip->download('latest_stuff.zip'); // File will be named "latest_stuff.zip"

注解

在调用这个方法的控制器里不要显示任何数据,因为这个方法会发送多个服务器 HTTP 头,让文件以二进制的格式被下载。

  • get_zip()

返回:Zip file content返回类型:string

返回使用 Zip 编码压缩后的文件数据,通常情况你无需使用该方法,除非你要对压缩后的数据做些特别的操作。例如:

  1. $name = 'my_bio.txt';
  2. $data = 'I was born in an elevator...';
  3.  
  4. $this->zip->add_data($name, $data);
  5.  
  6. $zip_file = $this->zip->get_zip();
  • clear_data()

返回类型:void

Zip 类会缓存压缩后的数据,这样就不用在调用每个方法的时候重新压缩一遍了。但是,如果你需要创建多个 Zip文档,每个 Zip 文档有着不同的数据,那么你可以在多次调用之间把缓存清除掉。例如:

  1. $name = 'my_bio.txt';
  2. $data = 'I was born in an elevator...';
  3.  
  4. $this->zip->add_data($name, $data);
  5. $zip_file = $this->zip->get_zip();
  6.  
  7. $this->zip->clear_data();
  8.  
  9. $name = 'photo.jpg';
  10. $this->zip->read_file("/path/to/photo.jpg"); // Read the file's contents
  11.  
  12. $this->zip->download('myphotos.zip');