包含非 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
用於尋找項目的旗標。下列值可以使用 OR 運算結合。
成功時返回項目的內容,失敗時返回 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 檔案內使用的路徑分隔符號是反斜線或正斜線,因為在這邊也會造成差異。
希望我幫您省去處理這個(到目前為止)未提及的「特性」時的頭痛 :)