首页 >后端开发 >php教程 >如何在php中拉链和解开拉链文件

如何在php中拉链和解开拉链文件

Joseph Gordon-Levitt
Joseph Gordon-Levitt原创
2025-03-04 10:39:10631浏览

How to Zip and Unzip Files in PHP

网络传输文件压缩优势显着,压缩后文件总大小通常大幅减小,节省带宽并加快用户下载速度。用户下载后可随时解压。简而言之,压缩能显着简化您和访问者的文件网络传输。

手动压缩文件可能繁琐,但幸运的是,PHP 提供许多专门处理文件压缩和解压的扩展。您可以使用这些扩展中的函数来自动压缩 PHP 文件。

本教程将指导您如何在 PHP 中将文件压缩到 zip 存档中以及从 zip 存档中解压文件。您还将学习如何在不先解压的情况下删除或重命名存档中的文件。

  • PHP 单文件压缩
  • 目录下多文件压缩
  • 修改或覆盖存档
  • 从存档中提取内容
  • 更多存档控制

PHP 单文件压缩

PHP 的 ZipArchive::RDONLY 标志(PHP 7.4.3 及更高版本可用)允许您以只读模式打开存档。

您可以查阅此方法的文档,了解在打开文件失败时返回的不同错误代码。如果 zip 文件成功打开或创建,则如果现有存档的内容无关紧要,则该方法将返回 ZipArchive::OVERWRITE 标志。如果不存在具有该特定名称的存档,则它不会创建新的存档。

您可以组合使用 ZipArchive::CREATE 来覆盖现有存档并在不存在具有该特定名称的存档时创建新的存档。示例如下:

$zip->open('my_compressed_files.zip', ZipArchive::OVERWRITE|ZipArchive::CREATE);

使用 ZipArchive::CREATE 和 open() 方法打开新的或现有的存档以进行读写。

在本节中,我们将了解由于传递给 $options 的不同标志组合而可能产生的差异,传递给 ZipArchive::CREATE 将创建新的存档或修改现有的存档(如果已存在)。您不会收到有关修改现有存档的任何警告。这意味着,如果您执行本节中的代码来创建存档,然后在将原始选项替换为新选项后再次执行它,您将得到一些意外的结果。

然后,存档将包含一个 wallpapers 目录,其中包含子目录 files/images 以及 wallpapers 目录中的图像。在刚开始时可能会有点令人困惑,并且可能会让您想知道为什么如果要覆盖存档中的所有内容(如果已存在),但如果不存在则不希望代码抛出错误,则使用 ZipArchive::CREATE|ZipArchive::OVERWRITE。

还请记住,自 libzip 1.6.0 起,空文件不再被视为有效存档。

从存档中提取内容

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

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

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

$zip->open('my_compressed_files.zip', ZipArchive::OVERWRITE|ZipArchive::CREATE);

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

更多存档控制

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

您可以使用 count() 方法计算存档中的文件数。另一种选择是使用 numFiles 属性。它们可用于迭代存档中的所有文件,仅提取所需的文件,或者您可以对它们执行其他操作,例如从存档中删除它们。

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

<?php

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

?>

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

类似的函数 renameName($oldname, $newname) 可用于更改存档中任何文件的名称。如果名为 $newname 的文件已存在,您将收到错误消息。

总结

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

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

以上是如何在php中拉链和解开拉链文件的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn