对包含非 ASCII 字符的文件名的处理没有记录。似乎此函数调用了 <?php mb_convert_encoding($name,"CP850","UTF-8") ?>,因此它在 zipfile 中期望 DOS 编码,但在名称中期望 UTF-8 编码。如果 zipfile 使用 UTF-8 名称(Pkzip 4.5 / Winzip 11.2),此函数将失败。使用 getFromIndex 作为一种解决方法。
(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.1.0)
ZipArchive::getFromName — 使用其名称返回条目内容
使用其名称返回条目内容。
name
条目的名称
len
要从条目中读取的长度。如果为 0
,则读取整个条目。
flags
用于查找条目的标志。以下值可以按位或运算。
成功时返回条目的内容,失败时返回 false
。
示例 #1 获取文件内容
<?php
$zip = new ZipArchive;
if ($zip->open('test1.zip') === TRUE) {
echo $zip->getFromName('testfromfile.php');
$zip->close();
} else {
echo 'failed';
}
?>
示例 #2 从 zip 条目转换图像
<?php
$z = new ZipArchive();
if ($z->open(dirname(__FILE__) . '/test_im.zip')) {
$im_string = $z->getFromName("pear_item.gif");
$im = imagecreatefromstring($im_string);
imagepng($im, 'b.png');
}
?>
对包含非 ASCII 字符的文件名的处理没有记录。似乎此函数调用了 <?php mb_convert_encoding($name,"CP850","UTF-8") ?>,因此它在 zipfile 中期望 DOS 编码,但在名称中期望 UTF-8 编码。如果 zipfile 使用 UTF-8 名称(Pkzip 4.5 / Winzip 11.2),此函数将失败。使用 getFromIndex 作为一种解决方法。
当将包含相对路径(在 ZIP 存档内)的显式字符串传递给方法时,例如 'path/to/file.php/',请确保使用单引号 (') 而不是双引号 (")。双引号会生成 FALSE(至少在 Windows 机器上),没有任何进一步的提示说明哪里出错了。
此外,请确保 ZIP 文件中使用的路径分隔符是反斜杠或正斜杠,因为在这个地方也会产生差异。
我希望我为你省去了使用这个(到目前为止)未提及的“功能”时的头痛。