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

通过Internet传输文件时压缩文件有很多优点。 在大多数情况下,压缩格式的所有文件的总大小总和会减少。 这意味着您将节省一些带宽,并且用户还将获得更快的下载速度。 用户下载文件后,便可以随时对其进行解压缩。 简而言之,压缩可以使您和您的访问者在Internet上提供文件更加容易。

可能会阻止您压缩文件或使过程变得非常繁琐的一个因素是您可能手动进行了操作。 幸运的是,PHP附带了许多扩展,专门用于文件压缩和提取。 您可以使用这些扩展中提供的功能来自动压缩PHP中的文件。

本教程将教您如何在PHP的zip归档文件中对文件进行zip和解压缩(压缩和提取)。 您还将学习如何在不首先解压缩文件的情况下删除或重命名档案中的文件。

用PHP压缩文件

PHP ZipArchive类具有许多属性和方法,可以帮助您压缩和解压缩所有文件。

压缩单个文件

您可以一次将文件添加到zip存档中,也可以一次添加整个目录。 无论哪种情况,第一步都是创建一个新的ZipArchive实例,然后调用open($filename, [$flags])方法。 此方法将打开一个新的zip归档文件,以供阅读,编写或其他修改。 可选的$flag参数有四个有效值,这些值确定如何处理不同的情况。

  • ZipArchive::OVERWRITE此标志将覆盖指定存档中的内容(如果已存在)。
  • ZipArchive::CREATE CREATE-如果该标记尚不存在,它将创建一个新的档案。
  • ZipArchive::EXCL如果存档已经存在,则此标志将导致错误。
  • ZipArchive::CHECKCONS —此标志将告诉PHP对归档执行附加的一致性检查,如果失败则给出错误。

您可以查看此方法文档,以了解在无法打开文件的情况下返回的不同错误代码。 如果zip文件已成功打开或创建,则该方法将返回true

成功打开存档后,可以使用addFile($filename, $localname, $start, $length)方法将给定路径中的任何文件添加到存档中。 $filename参数是要添加到存档中的文件的路径。 $localname参数用于为文件分配名称,以将其存储在存档中。 每次要将新文件添加到存档时,都可以调用addFile()

将所有必需的文件添加到存档后,您可以简单地调用close()方法将其关闭并保存更改。

假设您有一个网站,该网站允许用户下载不同字体的字体文件以及使用许可的许可信息。 这些文件将是使用PHP自动归档的完美示例。 以下代码向您展示了如何做到这一点。

<?php

$zip = new ZipArchive();
$zip->open('compressed/font_files.zip', ZipArchive::CREATE);
 
$zip->addFile('fonts/Monoton/Monoton-Regular.ttf', 'Monoton-Regular.ttf');
$zip->addFile('fonts/Monoton/OFL.txt', 'license.txt');
 
$zip->close();

?>

我们首先创建一个ZipArchive实例,然后使用open()方法创建存档。 addFile()方法将实际的.ttf字体文件和.txt许可证文件添加到存档中。

您应注意,原始文件位于fonts / Monoton目录中。 但是,PHP代码将其直接放在存档的根目录中。 您可以更改目录结构以及归档文件中的文件名。

从目录压缩多个文件

过一段时间后,将单个文件添加到存档中可能会很累。 例如,您可能要创建目录中所有.pdf.png文件的存档。 在这种情况下addGlob($pattern, $flags, $options)方法将非常有用。 该方法的唯一缺点是您无法控制归档中单个文件的位置。 但是,您仍然可以使用$options参数来影响归档文件内的目录结构。 选项以关联数组的形式传递。

  • add_path分配给add_path值的前缀是归档中文件的本地路径。
  • remove_path分配给remove_path值用于从添加到存档的不同文件的路径中删除匹配的前缀。
  • remove_all_path -设置的值remove_all_pathtrue将从除了其名的文件的路径中删除所有内容。 在这种情况下,文件将添加到存档的根目录。

重要的是要记住,删除路径是在add_path指定的值add_path前缀之前完成的。

以下代码段将使用addGlob() ,所有这些选项都将变得更加清晰。

$zip = new ZipArchive();
$zip->open('compressed/user_archive.zip', ZipArchive::CREATE);
 
$options = array('add_path' => 'light_wallpapers/', 'remove_all_path' => TRUE);
$zip->addGlob('lights/*.jpg', 0, $options);

$options = array('add_path' => 'font_files/', 'remove_all_path' => TRUE);
$zip->addGlob('documents/*.ttf', 0, $options);

$options = array('add_path' => 'pdf_books/', 'remove_all_path' => TRUE);
$zip->addGlob('documents/*.pdf', 0, $options);

$options = array('add_path' => 'images/', 'remove_all_path' => TRUE);
$zip->addGlob('documents/*.{jpg, png}', GLOB_BRACE, $options);
 
$zip->close();

与往常一样,我们首先创建一个ZipArchive实例,然后使用open()方法创建存档。 每次调用addGlob()方法之前,我们还为$options数组中的add_path键指定不同的值。 这样,我们可以一次处理一组特定的文件,并相应地提供归档选项。

在第一种情况下,我们遍历lights目录中的所有.jpg文件,并将它们放置在档案库的light_wallpapers目录中。 同样,我们遍历documents目录中的所有.ttf文件,然后将它们放在存档中名为font_files的文件夹中。 最后,我们一次遍历文档中的所有.jpg.png文件,并将它们全部放到images目录中。

如您所见, $options参数中的值对于组织归档文件中的内容很有用。

从档案中提取内容

ZipArchive类具有一个称为extractTo($destination, $entries)用于提取档案的内容。 您可以使用它来提取存档中的所有内容或仅提取某些特定文件。 $entries参数可用于指定要提取的单个文件名,也可以使用它传递文件数组。

要记住的重要一点是,您需要在档案内部指定文件的正确路径才能提取它。 例如,我们在上一节中存档了一个名为AlegreyaSans-Light.ttf的字体文件。 该文件存储在存档中名为font_files的目录中。 这意味着您需要在$entries参数中指定的路径将是font_files / AlegreyaSans-Light.ttf ,而不仅仅是AlegreyaSans-Light.ttf

在提取过程中将保留目录和文件结构,并将文件提取到其各自的目录中。

<?php

$zip = new ZipArchive();
$zip->open('compressed/user_archive.zip', ZipArchive::CREATE);
$zip->extractTo('uncompressed/', 'font_files/AlegreyaSans-Light.ttf');
$zip->close();
 
?>

如果省略第二个参数,则该方法将提取存档中的所有文件。

更好地控制档案

ZipArchive类还具有许多其他方法和属性,可帮助您在提取其所有内容之前获取有关存档的更多信息。

您可以使用count()方法count()归档文件中的文件count() 。 另一种选择是使用numFiles属性。 它们可用于遍历归档文件中的所有文件,而仅提取您需要的文件,或者您可以对它们进行其他操作,例如从归档文件中删除它们。

在以下示例中,我们将删除档案中包含单词Italic的所有文件。 类似的代码可用于删除所有不包含特定单词的文件。 您还可以遍历这些文件,并用其他内容替换特定的单词。

<?php

$zip = new ZipArchive();
$zip->open('compressed/user_archive.zip', ZipArchive::CREATE);

$file_count = $zip->count();

for($i = 0; $i < $file_count; $i++) {
    $file_name = $zip->getNameIndex($i);

    if(stripos($file_name, 'Italic') !== false) {
        $zip->deleteName($file_name);
    }
}
 
$zip->close();

?>

在上面的代码中,我们使用deleteName()删除单个文件。 但是,您也可以使用它来删除整个目录。

可以使用类似的函数renameName($oldname, $newname)更改存档中任何文件的名称。 如果标题为$newname的文件已经存在,则会出现错误。

最后的想法

我们介绍了ZipArchive类的许多非常有用的方法,这些方法将使自动压缩和提取PHP中的文件变得轻而易举。 现在,您应该可以根据自己的标准一次压缩单个文件或一组文件。 同样,您应该能够从存档中提取任何特定文件,而不会影响其他内容。

借助count()numFiles ,您可以更好地控制单个文件,并且重命名或删除它们将非常容易。 您应该至少阅读一次文档 ,以了解更多此类功能。

翻译自: https://code.tutsplus.com/tutorials/file-compression-and-extraction-in-php--cms-31977

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值