如何在CodeIgniter中压缩和解压缩文件

本教程的前半部分介绍了使用内置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.txtprofile.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.txtprofile.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.jpg2.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'); ?>">&lt;&lt; Back to File Uploader</a>
	</div>
</div>

</body>
</html>

上载并提取文件后,将向用户显示以上模板。

现在,让我们回到我们的控制器并遍历每种方法。

在控制器的构造函数中,我们已加载了内置表单URL CodeIgniter帮助器,以便可以使用诸如form_open_multipartsite_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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值