Board logo

标题: 使用新的 ZIP 扩展(2) [打印本页]

作者: look_w    时间: 2018-7-20 10:21     标题: 使用新的 ZIP 扩展(2)

我们向用户展示归档中的文件数并关闭文件,将其保存为 ZIP 归档,准备供用户下载。您可能会注意到在连续按 Refresh 或用其他方法运行 PHP 脚本时,ZIP 中的文件数会增长。这是因为一直在打开同一个目录中的同一个文件,添加两个字符串作为文件,并再次关闭。
图 1. zipcreate.php 的样例输出正如您会注意到的,实际上并未把新文件添加到 ZIP 中。我们需要把诗歌放在其中,以便用户获得一些训练。让我们现在就来添加。
清单 3. 将外部文件添加到 newzip.zip 中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
$zip = new ZipArchive();
$filename = "newzip.zip";

if ($zip->open($filename, ZIPARCHIVE::CREATE)!==TRUE) {
   exit("cannot open <$filename>\n");
}

$zip->addFromString("firstfile." . time() . ".txt", \
"This is the first file in our ZIP, added as
firstfile.txt.\n");
$zip->addFromString("testdir/secondfile." . time() . ".txt", \
"This is the second file in our ZIP,
added as secondfile.txt.\n");
$zip->addFile("testtext.txt");
echo "numfiles: " . $zip->numFiles . "\n";
$zip->close();
?>




这样看来,路径是相对的,只是指向了需要添加到 ZIP 中的文件并使用 addFile() 方法把它打包在其中。如果文件 testtext.txt 位于同一个目录中,这样做可以将其添加到归档中。现在已经通过任意的字符串数据创建了新归档文件并已经把外部文件添加到了归档中。这些都是创建新归档时最常见的任务。
打开归档如果我们不能从归档中恢复出可正常使用的文件,那么 ZIP 文件就没有多大用处。一些程序可以把文件直接从归档中读出,但是这些程序必须先把文件解压缩。最常见的处理方法是,简单地打开整个文件并将其展开为单个组件文件,把这些文件准备好以供正常使用。出于我们的目的,将打开先前创建的 ZIP 文件并查看其内容。
清单 4. zipread.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
$zip = new ZipArchive();
$filename = 'newzip.zip';

if ($zip->open($filename)!==TRUE) {
   exit("cannot open <$filename>\n");
}

print_r($zip);
var_dump($zip);

echo "<br><br>";
echo "The file " .$filename. " has the following files:\n <br>";

for ($i=0; $i<$zip->numFiles;$i++) {
   echo "index: $i\n";
   print_r($zip->statIndex($i));
   echo "<br>\n";
}

$zip->extractTo('./testdestination/');

$zip->close();
?>




像以前一样,在名为 $zip 的变量表单中创建 ZipArchive 类的新实例。使用 ZipArchive 的 open() 方法,打开已创建的 ZIP 归档。if 语句将用作简单的错误控制,如果由于用户的小失误而导致它未找到文件,则退出脚本。如果成功打开文件,脚本将继续执行并把关于 ZIP 归档的一些信息打印给用户。
到此为止,我们完成了两项重要任务。逐个列出了 ZIP 归档中的文件。由于将从 $zip 对象输出索引数组,因此将获得大量数据,包括文件大小、校验和信息。要减少数据量,在特定索引中查看文件的各个属性即可。
一旦打印出文件中的内容,所有内容就会被释放到名为 testdestination 的目录中。如果此目录不可用,系统将为我们创建该目录。此时需要注意的是如果目录已存在,或者如果解压缩的目标目录中已经有同名文件,则 ZIP 函数将覆盖原有内容。
我们已经打开了 ZIP 归档,通过保存到本地目录为使用文件做好了准备,并且列出了内容,可为修改初始的 ZIP 文件做好准备。这些简单的任务只是一个开始,并且几乎不能用于最复杂应用程序的文件压缩。巧妙地使用压缩可以为所有类型的文件传输带来更多便利。PHP 中的 ZIP 本机支持将使大量文件传输问题得以解决。
结束语在处理拥有大量空白或重复数据的大型文件时,ZIP 是一种十分优秀方法,能够降低带宽负载或存储设备使用量。我们可以清理掉文件中的大量冗余或空白,并使其减少到只包含基本要素,从而使文件更加紧凑。这样做都可以明显地减少文件在文件系统中占用的空间大小以及移动文件时所需的全部带宽负载。
一种可能的应用是在需要把大量文件上传到服务器上时,比如需要把照片上传到照片库中或上传许多文本文件。您可以简单地 ZIP 文件并同样让上传脚本将文件解压缩,而不用费力地在上传对话框中逐个上传文件。这可以免去必须单击 Browse 对话框的痛苦。
一般而言,ZIP 那些不会被直接访问的文件或者下载后再使用的文件是个好主意 —— 并且我们最终使 PHP 拥有了这种功能。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0