示例

示例 #1 创建一个 Zip 归档文件

<?php

$zip
= new ZipArchive();
$filename = "./test112.zip";

if (
$zip->open($filename, ZipArchive::CREATE)!==TRUE) {
exit(
"无法打开 <$filename>\n");
}

$zip->addFromString("testfilephp.txt" . time(), "#1 这是一个作为 testfilephp.txt 添加的测试字符串。\n");
$zip->addFromString("testfilephp2.txt" . time(), "#2 这是一个作为 testfilephp2.txt 添加的测试字符串。\n");
$zip->addFile($thisdir . "/too.php","/testfromfile.php");
echo
"文件数量: " . $zip->numFiles . "\n";
echo
"状态: " . $zip->status . "\n";
$zip->close();
?>

示例 #2 转储归档文件详细信息和列表

<?php
$za
= new ZipArchive();

$za->open('test_with_comment.zip');
print_r($za);
var_dump($za);
echo
"文件数量: " . $za->numFiles . "\n";
echo
"状态: " . $za->status . "\n";
echo
"系统状态: " . $za->statusSys . "\n";
echo
"文件名: " . $za->filename . "\n";
echo
"注释: " . $za->comment . "\n";

for (
$i=0; $i<$za->numFiles;$i++) {
echo
"索引: $i\n";
print_r($za->statIndex($i));
}
echo
"文件数量: " . $za->numFiles . "\n";
?>

示例 #3 Zip 流包装器,读取 OpenOffice 元信息

<?php
$reader
= new XMLReader();

$reader->open('zip://' . dirname(__FILE__) . '/test.odt#meta.xml');
$odt_meta = array();
while (
$reader->read()) {
if (
$reader->nodeType == XMLREADER::ELEMENT) {
$elm = $reader->name;
} else {
if (
$reader->nodeType == XMLREADER::END_ELEMENT && $reader->name == 'office:meta') {
break;
}
if (!
trim($reader->value)) {
continue;
}
$odt_meta[$elm] = $reader->value;
}
}
print_r($odt_meta);
?>

此示例使用旧的 API(PHP 4),它打开一个 ZIP 文件归档文件,读取归档文件中的每个文件,并打印出其内容。在本示例中使用的 test2.zip 归档文件是 ZZIPlib 源代码分发版中的一个测试归档文件。

示例 #4 Zip 使用示例

<?php

$zip
= zip_open("/tmp/test2.zip");

if (
$zip) {
while (
$zip_entry = zip_read($zip)) {
echo
"Name: " . zip_entry_name($zip_entry) . "\n";
echo
"Actual Filesize: " . zip_entry_filesize($zip_entry) . "\n";
echo
"Compressed Size: " . zip_entry_compressedsize($zip_entry) . "\n";
echo
"Compression Method: " . zip_entry_compressionmethod($zip_entry) . "\n";

if (
zip_entry_open($zip, $zip_entry, '"r"')) {
echo
"File Contents:\n";
$buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
echo
'"$buf"\n"';

zip_entry_close($zip_entry);
}
echo
"\n";

}

zip_close($zip);

}
?>
添加备注

用户贡献的备注 5 个备注

info at peterhofer dot ch
15 年前
如果 PHP 脚本在文件夹中没有写入权限,所有这些示例都无法正常工作。

虽然您可能会说这是显而易见的,但我发现,在这种情况下,$zip->open("name", ZIPARCHIVE::CREATE) 不会返回错误,因为它可能不会尝试访问文件系统,而是分配内存。

只有 $zip->close() 会返回错误。这可能会导致您在错误的端点进行搜索。
webmaster @ anonymous
11 年前
您可以使用此代码读取 JAR 文件(Java 存档)。

JAR 文件使用相同的 ZIP 格式,因此可以轻松读取。

$zf = zip_open(realpath('D:/lucene/allinone/lucene-core.jar')); $i=1;
while($zf && $ze = zip_read($zf)) {
$zi[$i]['zip entry name']= zip_entry_name($ze);
$zi[$i]['zip entry filesize']= zip_entry_filesize($ze);
$zi[$i]['zip entry compressed size']= zip_entry_compressedsize($ze);
$zi[$i]['zip entry compression method']= zip_entry_compressionmethod($ze);
$zi[$i]['zip entry open status'] = zip_entry_open($zf,$ze);
//$zi[$i]['zip entry file contents'] = zip_entry_read($ze,100);
$i++;
}
print_r($zi);
zip_close($zf);
geandjay at gmail dot com
16 年前
<?php
$zip
= new ZipArchive;
$zip->open('teste.zip');
$zip->extractTo('./');
$zip->close();
echo
"Ok!";
?>
Stefano Di Paolo
15 年前
1) 如果您想将文件添加到 ZIP 存档,但您不知道 ZIP 文件是否存在,则必须检查:这会改变您打开它的方式!.
2) 您不能追加多个标志,只能使用一个(或没有)。

如果 zip 不存在,请使用以下方式打开它:
$ziph->open($archiveFile, ZIPARCHIVE::CM_PKWARE_IMPLODE)
(或其他压缩方法)

如果 zip 已存在,请使用以下方式打开它:
$ziph->open($archiveFile)

$ziph->open($archiveFile, ZIPARCHIVE::CHECKCONS)

示例:每小时制作备份文件并将它们全部 ZIP 到每日 ZIP 存档中,因此您每天只想要获取一个 ZIP,每个 ZIP 包含 24 个文件。
<?php
function archivebackup($archiveFile, $file, &$errMsg)
{
$ziph = new ZipArchive();
if(
file_exists($archiveFile))
{
if(
$ziph->open($archiveFile, ZIPARCHIVE::CHECKCONS) !== TRUE)
{
$errMsg = "无法打开 $archiveFile";
return
1;
}
}
else
{
if(
$ziph->open($archiveFile, ZIPARCHIVE::CM_PKWARE_IMPLODE) !== TRUE)
{
$errMsg = "无法创建 $archiveFile";
return
1;
}
}
if(!
$ziph->addFile($file))
{
$errMsg = "将 $file 存档到 $archiveFile 时出错";
return
2;
}
$ziph->close();

return
0;
}
?>
Jonathan
14 年前
如果您发现您的 zip 文件没有创建,请确保您添加到 zip 的每个文件都是有效的。即使只有一个文件在调用 zip->close 时不可用,也会导致存档失败,并且您的 zip 文件将不会创建。
To Top