本教程的前半部分介绍了使用内置CodeIgniter API创建zip文件的不同方法。 我们将看到如何在服务器上创建和保存zip文件,以及如何使它们可供最终用户下载。
下半部分讨论如何解压缩文件。 为了说明这一点,我们将构建一个自定义页面,允许用户上传成功上传文件后将在服务器上提取的zip文件。 为了实现所需的功能,ZipArchive PHP扩展来了!
在继续进行开发工作之前,我将列出在本教程中将要开发的文件:
-
application/controllers/Zip.php
:这是一个控制器文件,演示了创建zip文件的各种方法。 -
application/controllers/Unzip.php
:这是一个控制器文件,其中包含用于解压缩用户上传文件的代码。 -
application/views/file_upload_form.php
:这是一个视图文件,其中包含非常基本HTML文件上传表单代码。 -
application/views/file_upload_result.php
:这是一个查看文件,显示了用户上传文件的结果; 基本上,它告诉您文件是否已成功解压缩。 -
application/libraries/Extractor.php
:此文件演示了CodeIgniter中自定义库的概念。
一切就绪后,我们就可以继续进行下一部分了!
如何压缩文件?
继续创建具有以下内容的文件application/controllers/Zip.php
。
<?php
// application/controllers/Zip.php
defined('BASEPATH') OR exit('No direct script access allowed');
class Zip extends CI_Controller {
private function _load_zip_lib()
{
$this->load->library('zip');
}
private function _archieve_and_download($filename)
{
// create zip file on server
$this->zip->archive(FCPATH.'/uploads/'.$filename);
// prompt user to download the zip file
$this->zip->download($filename);
}
public function data()
{
$this->_load_zip_lib();
$this->zip->add_data('name.txt', 'Sajal Soni');
$this->zip->add_data('profile.txt', 'Web Developer');
$this->_archieve_and_download('my_info.zip');
}
public function data_array()
{
$this->_load_zip_lib();
$files = array(
'name.txt' => 'Sajal Soni',
'profile.txt' => 'Web Developer'
);
$this->zip->add_data($files);
$this->_archieve_and_download('my_info.zip');
}
public function data_with_subdirs()
{
$this->_load_zip_lib();
$this->zip->add_data('info/name.txt', 'Sajal Soni');
$this->zip->add_data('info/profile.txt', 'Web Developer');
$this->_archieve_and_download('my_info.zip');
}
public function files()
{
$this->_load_zip_lib();
// pass second argument as TRUE if want to preserve dir structure
$this->zip->read_file(FCPATH.'/uploads/1.jpg');
$this->zip->read_file(FCPATH.'/uploads/2.jpg');
$this->_archieve_and_download('images.zip');
}
public function dir()
{
$this->_load_zip_lib();
// pass second argument as FALSE if want to ignore preceding directories
$this->zip->read_dir(FCPATH.'/uploads/images/');
$this->_archieve_and_download('dir_images.zip');
}
}
这是您已经熟悉的标准控制器文件。 它包含几种方法,每种方法都向您展示了创建zip文件的不同方法。
除此之外,它提供了两个私有方法_load_zip_lib
和_archieve_and_download
,它们从其余方法中调用。 当然,您不需要实现这些方法,但是我们只是重构了代码,因此您最终不会在其他方法中重复相同的代码。 让我们首先介绍这两种方法。
这是_load_zip_lib
方法的外观。
private function _load_zip_lib()
{
$this->load->library('zip');
}
它会加载CodeIgniter框架的内置zip库,以便您可以在其余代码中使用该库的功能。 现在,您可以使用$this->zip
约定访问zip库。
接下来,是_archieve_and_download
方法。
private function _archieve_and_download($filename)
{
// create zip file on server
$this->zip->archive(FCPATH.'/uploads/'.$filename);
// prompt user to download the zip file
$this->zip->download($filename);
}
加载zip库后,您可以使用它提供的方法。 使用archive方法可以在作为第一个参数提供的路径上创建一个zip文件。 另一方面,下载方法提示用户进行文件下载。
如果您对我们的zip文件的内容有所疑问,请不要担心,我们稍后会看到。
一切都准备就绪,所以我们可以开始了!
让我们获取data
方法的代码。 此方法向您展示了如何动态创建文件并将其包装为zip文件。
public function data()
{
$this->_load_zip_lib();
$this->zip->add_data('name.txt', 'Sajal Soni');
$this->zip->add_data('profile.txt', 'Web Developer');
$this->_archieve_and_download('my_info.zip');
}
首先,我们调用了_load_zip_lib
方法来加载zip库。 接下来,我们使用了zip类的add_data
方法,该方法使您可以创建文件并同时将其填充内容! 当然,它也已添加到存档中!
第一个参数应为文件名,第二个参数应包含文件中的内容。
如您所见,我们添加了两个文件, name.txt
和profile.txt
,其中包含一些演示内容。 最后,我们使用my_info.zip
作为该方法的参数调用_archieve_and_download
。 它有什么作用?
- 它将在您的上载目录下创建一个zip文件
my_info.zip
。 - 它还会提示用户下载文件,保存文件的名称是
my_info.zip
。
因此,请确保您已经在网站的根目录下创建了一个uploads
目录。 另外,使其对Web服务器用户可写。 现在,继续运行“ http:// my-codeingiter-site / zip / data ”以查看实际情况!
如果您有任何问题,可以在评论中问我!
接下来,有data_array
方法。
public function data_array()
{
$this->_load_zip_lib();
$files = array(
'name.txt' => 'Sajal Soni',
'profile.txt' => 'Web Developer'
);
$this->zip->add_data($files);
$this->_archieve_and_download('my_info.zip');
}
此方法与我们刚刚讨论的最后一个方法相同,除了我们向add_data
方法提供了文件数组而不是单个文件之外!
接下来,让我们获取data_with_subdirs
方法的代码。
public function data_with_subdirs()
{
$this->_load_zip_lib();
$this->zip->add_data('info/name.txt', 'Sajal Soni');
$this->zip->add_data('info/profile.txt', 'Web Developer');
$this->_archieve_and_download('my_info.zip');
}
万一您想在某些目录中组织文件,可以使用add_data
方法创建它们。 除了将name.txt
和profile.txt
文件放置在info
目录中之外,上述方法的结果输出没有什么不同。
尽管add_data
方法提供了一项不错的功能,可让您即时创建文件,但通常需要压缩服务器上的现有文件。 无论如何,这正是我们接下来的两种方法的主题。
让我们快速查看下一个files
方法的外观。 它将在uploads
目录下创建一个文件zip。
public function files()
{
$this->_load_zip_lib();
// pass second argument as TRUE if want to preserve dir structure
$this->zip->read_file(FCPATH.'/uploads/1.jpg');
$this->zip->read_file(FCPATH.'/uploads/2.jpg');
$this->_archieve_and_download('images.zip');
}
read_file
方法的目的是读取服务器上的现有文件并将其添加到存档中。 如您所见,我们已经将两个文件1.jpg
和2.jpg
到存档中。 当然,这两个文件必须位于网站根目录的uploads
目录下。
如果将TRUE
作为read_file
方法的第二个参数传递,则生成的zip文件将保留文件所在的确切目录结构。
尝试运行http:// my-codeingiter-site / zip / files并检查结果!
该段中的最后一个方法是dir
方法。 它将创建整个目录的zip存档。
public function dir()
{
$this->_load_zip_lib();
// pass second argument as FALSE if want to ignore preceding directories
$this->zip->read_dir(FCPATH.'/uploads/images/');
$this->_archieve_and_download('dir_images.zip');
}
如果要创建整个目录的zip存档而不是某些文件的zip存档,则可以使用read_dir
方法。 在上面的示例中,它将创建一个dir_images.zip
文件,其中包含/uploads/images/
目录下的所有文件。
这里要注意的重要一点是,默认情况下,整个目录结构将保留在zip文件中。 但是,如果要忽略它,只需将FALSE
作为read_dir
方法的第二个参数传递。 在这种情况下,它将仅在zip文件中创建一个images
目录。
这样就结束了我们关于如何使用内置zip类提供的各种方法创建zip存档的故事。
如何解压缩文件?
不幸的是,没有内置的CodeIgniter库允许我们解压缩zip存档。 但是ZipArchive PHP扩展使它变得轻而易举,稍后我们将看到。
我们将创建一个非常简单的示例,演示如何解压缩用户上传的文件。
继续创建具有以下内容的文件application/controllers/Unzip.php
。
<?php
// application/controllers/Unzip.php
defined('BASEPATH') OR exit('No direct script access allowed');
class Unzip extends CI_Controller {
public function __construct()
{
parent::__construct();
$this->load->helper(array('form', 'url'));
}
public function index()
{
$this->load->view('file_upload_form');
}
public function upload()
{
$config['upload_path'] = './uploads/';
$config['allowed_types'] = 'zip';
$this->load->library('upload', $config);
if ( ! $this->upload->do_upload('zip_file'))
{
$params = array('error' => $this->upload->display_errors());
}
else
{
$data = array('upload_data' => $this->upload->data());
$full_path = $data['upload_data']['full_path'];
/**** without library ****/
$zip = new ZipArchive;
if ($zip->open($full_path) === TRUE)
{
$zip->extractTo(FCPATH.'/uploads/');
$zip->close();
}
$params = array('success' => 'Extracted successfully!');
}
$this->load->view('file_upload_result', $params);
}
}
让我们也创建视图模板,然后看一下它是如何工作的。
创建具有以下内容的视图模板文件application/views/file_upload_form.php
。
<?php
// application/views/file_upload_form.php
defined('BASEPATH') OR exit('No direct script access allowed');
?><!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Welcome to CodeIgniter</title>
<style type="text/css">
::selection { background-color: #E13300; color: white; }
::-moz-selection { background-color: #E13300; color: white; }
body {
background-color: #fff;
margin: 40px;
font: 13px/20px normal Helvetica, Arial, sans-serif;
color: #4F5155;
}
a {
color: #003399;
background-color: transparent;
font-weight: normal;
}
h1 {
color: #444;
background-color: transparent;
border-bottom: 1px solid #D0D0D0;
font-size: 19px;
font-weight: normal;
margin: 0 0 14px 0;
padding: 14px 15px 10px 15px;
}
code {
font-family: Consolas, Monaco, Courier New, Courier, monospace;
font-size: 12px;
background-color: #f9f9f9;
border: 1px solid #D0D0D0;
color: #002166;
display: block;
margin: 14px 0 14px 0;
padding: 12px 10px 12px 10px;
}
#body {
margin: 0 15px 0 15px;
}
p.footer {
text-align: right;
font-size: 11px;
border-top: 1px solid #D0D0D0;
line-height: 32px;
padding: 0 10px 0 10px;
margin: 20px 0 0 0;
}
#container {
margin: 10px;
border: 1px solid #D0D0D0;
box-shadow: 0 0 8px #D0D0D0;
}
div {
padding: 10px;
}
.error {
color: #F00;
}
.success {
color: #00F;
}
</style>
</head>
<body>
<div id="container">
<h1>Upload File</h1>
<div id="body">
<div class="success"><?php if (isset($success)) {echo $success;}?></div>
<div class="error"><?php if (isset($error)) {echo $error;}?></div>
<?php echo form_open_multipart('unzip/upload');?>
<div>
<input name="zip_file" type="file"/>
</div>
<div>
<input type="submit" value="Upload Zip File" />
</div>
</form>
</div>
</div>
</body>
</html>
它会创建一个简单的文件上传表单,以便用户可以上传zip文件! 请注意,为简单起见,我将其最小化。
接下来,让我们创建一个视图模板文件application/views/file_upload_result.php
。
<?php
// application/views/file_upload_result.php
defined('BASEPATH') OR exit('No direct script access allowed');
?><!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Welcome to CodeIgniter</title>
<style type="text/css">
::selection { background-color: #E13300; color: white; }
::-moz-selection { background-color: #E13300; color: white; }
body {
background-color: #fff;
margin: 40px;
font: 13px/20px normal Helvetica, Arial, sans-serif;
color: #4F5155;
}
a {
color: #003399;
background-color: transparent;
font-weight: normal;
}
h1 {
color: #444;
background-color: transparent;
border-bottom: 1px solid #D0D0D0;
font-size: 19px;
font-weight: normal;
margin: 0 0 14px 0;
padding: 14px 15px 10px 15px;
}
code {
font-family: Consolas, Monaco, Courier New, Courier, monospace;
font-size: 12px;
background-color: #f9f9f9;
border: 1px solid #D0D0D0;
color: #002166;
display: block;
margin: 14px 0 14px 0;
padding: 12px 10px 12px 10px;
}
#body {
margin: 0 15px 0 15px;
}
p.footer {
text-align: right;
font-size: 11px;
border-top: 1px solid #D0D0D0;
line-height: 32px;
padding: 0 10px 0 10px;
margin: 20px 0 0 0;
}
#container {
margin: 10px;
border: 1px solid #D0D0D0;
box-shadow: 0 0 8px #D0D0D0;
}
div {
padding: 10px;
}
.error {
color: #F00;
}
.success {
color: #00F;
}
</style>
</head>
<body>
<div id="container">
<h1>Upload File Result</h1>
<div id="body">
<div class="success"><?php if (isset($success)) {echo $success;}?></div>
<div class="error"><?php if (isset($error)) {echo $error;}?></div>
<a href="<?php echo site_url('unzip/index'); ?>"><< Back to File Uploader</a>
</div>
</div>
</body>
</html>
上载并提取文件后,将向用户显示以上模板。
现在,让我们回到我们的控制器并遍历每种方法。
在控制器的构造函数中,我们已加载了内置表单和URL CodeIgniter帮助器,以便可以使用诸如form_open_multipart
, site_url
之类的帮助器函数。
接下来,让我们看一下index
方法。
public function index()
{
$this->load->view('file_upload_form');
}
这需要任何解释吗? 它调用视图file_upload_form
并呈现页面。 因此,当您访问http:// my-codeingiter-site / unzip时 ,它将显示一个简单的文件上传表单,如下所示。
另外,请注意,我们表单的操作是将数据发布到其中的unzip/upload
。 我们使用了form_open_multipart
帮助器来生成多部分表单标签!

接下来,我们需要实现上upload
操作方法,该方法将处理文件上载和提取内容。 从Unzip.php
控制器中获取代码。
public function upload()
{
$config['upload_path'] = './uploads/';
$config['allowed_types'] = 'zip';
$this->load->library('upload', $config);
if ( ! $this->upload->do_upload('zip_file'))
{
$params = array('error' => $this->upload->display_errors());
}
else
{
$data = array('upload_data' => $this->upload->data());
$full_path = $data['upload_data']['full_path'];
$zip = new ZipArchive;
if ($zip->open($full_path) === TRUE)
{
$zip->extractTo(FCPATH.'/uploads/');
$zip->close();
}
$params = array('success' => 'Extracted successfully!');
}
$this->load->view('file_upload_result', $params);
}
如果您熟悉使用CodeIgniter上传文件,则代码对您来说应该看起来不陌生。 对于那些不熟悉的人,没有什么可担心的,因为CodeIgniter中的内置上载API轻而易举。
以下代码使用$config
数组变量提供的一些初始配置加载上载库。
$this->load->library('upload', $config);
我们已经对其进行了配置,以便将上传的文件放置在应用程序根目录下的uploads
目录下,并且允许用户仅上传zip文件。
接下来,我们检查了文件上传是否失败,如果是这种情况,我们将获取一条有用的错误消息,并将其分配给$params
以便将其显示在模板中。
$params = array('error' => $this->upload->display_errors());
在这种情况下,文件已成功上传,因此下一步是获取上传文件的文件路径。
$data = array('upload_data' => $this->upload->data());
$full_path = $data['upload_data']['full_path'];
最后,我们实例化一个ZipArchive对象,打开我们的zip文件,并将其解压缩到uploads
目录。
$zip = new ZipArchive;
if ($zip->open($full_path) === TRUE)
{
$zip->extractTo(FCPATH.'/uploads/');
$zip->close();
}
那不是那么简单吗?
我们唯一剩下的就是调用file_upload_result
视图,这就是它的外观!

所以,这就是故事的另一部分!
将解压缩代码重构到库
您可能已经注意到,上upload
方法包含提取上载文件的ZipArchive代码。 如果您需要在多个地方使用该代码怎么办? 您可能会想根据需要复制并粘贴代码。
确实,CodeIgniter提供了一种更好的方法,使您可以集中化可在整个应用程序中使用的代码。 您可以创建一个自定义库。
继续创建具有以下内容的文件application/libraries/Extractor.php
。
<?php
// application/libraries/Extractor.php
class Extractor {
private $CI = NULL;
private $zip = NULL;
public function __construct($params = array())
{
$this->CI =& get_instance();
$this->zip = new ZipArchive;
}
public function extract($source_file, $dest_dir)
{
if ($this->zip->open($source_file) === TRUE)
{
$this->zip->extractTo($dest_dir);
$this->zip->close();
}
}
}
现在,继续进行操作,并用以下方法替换Unzip.php
控制器中的upload
方法。
public function upload()
{
$config['upload_path'] = './uploads/';
$config['allowed_types'] = 'zip';
$this->load->library('upload', $config);
if ( ! $this->upload->do_upload('zip_file'))
{
$params = array('error' => $this->upload->display_errors());
}
else
{
$data = array('upload_data' => $this->upload->data());
$full_path = $data['upload_data']['full_path'];
$this->load->library('extractor');
$this->extractor->extract($full_path, FCPATH.'/uploads/');
$params = array('success' => 'Extracted successfully!');
}
$this->load->view('file_upload_result', $params);
}
如您所见,我们已经加载了自定义库,并使用它来提取内容!
$this->load->library('extractor');
$this->extractor->extract($full_path, FCPATH.'/uploads/');
太酷了吧?
是的,这就是本文的结尾。
结论
我希望您喜欢本文,在本文中我们开始探索CodeIgniter框架的核心zip库以及创建zip归档文件的不同方法。 在第二部分中,我解释了如何使用ZipArchive PHP扩展解压缩用户上传的文件。
在此过程中,我们还获得了将代码转换为自定义CodeIgniter库的机会,我想说的是最上面的内容!
让我知道您是否有任何疑问和建议,可以使用下面的提要进行拍摄。
翻译自: https://code.tutsplus.com/tutorials/how-to-zip-and-unzip-files-in-codeigniter--cms-28600