[英]ZipArchive can't unzip files that ZipArchive zips in PHP
嘗試獲取導入/導出功能。
創建了新文件夾,但缺少該文件
function unArchive(){ $zip = new ZipArchive; $res = $zip->open('zipTest.zip'); if ($res === TRUE) { echo 'ok'; $zip->extractTo("testfolder2"); $zip->close(); } else { echo 'failed, code:' . $res; } } function Zip($source, $destination){ if (!extension_loaded('zip') || !file_exists($source)){ return false; } $zip = new ZipArchive(); if (!$zip->open($destination, ZIPARCHIVE::CREATE)) { return false; } $source = str_replace('\\\\', '/', realpath($source)); if (is_dir($source) === true){ $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST); foreach ($files as $file){ $file = str_replace('\\\\', '/', realpath($file)); if (is_dir($file) === true){ $zip->addEmptyDir( str_replace($source . '/', '', $file . '/') ); }else if (is_file($file) === true){ $zip->addFromString( str_replace($source . '/', '', $file), file_get_contents($file)); } } }else if (is_file($source) === true){ $zip->addFromString(basename($source), file_get_contents($source)); } return $zip->close(); } Zip( "testfolder/" , "./zipTest.zip" ); unArchive();
代碼適用於單個文件。 使用ZipArchive壓縮文件后,我可以使用WinRAR手動解壓縮,然后使用WinRAR重新壓縮,然后ZipArchive可以成功解壓縮該文件。 問題在於ZipArchive不會提取直接壓縮的存檔。 我還可以在Notepad ++中看到ZipArchive zip與WinRAR zip不同,並且文件大小也不同。 我可以成功調用winrar作為php中的系統命令以獲得所需的功能,但這似乎是個壞主意。 ZipArchive是否有某些原因創建無法提取的zip文件?
錯誤消息:ZipArchive :: extractTo():[$ zip-> extractTo(“ testfolder2”);]行上[file]中的無效參數
RecursiveIteratorIterator返回偽文件“”。 並且,這里很重要,“ ..”-父目錄。 當您使用addEmptyDir添加父目錄時,ZipArchive將添加它(以某種方式)! 您甚至可以嘗試“ $ zip-> addEmptyDir(“ ../ something”)”,它不會出現問題。
現在,通常,zip文件不會采用這種方式。 提取它們時,您希望所有內容都在提取它們的文件夾中,而不是父文件夾中。 這就是為什么普通的ZIP提取程序不顯示它的原因。
但是,PHP ZipArchive甚至會提取這些文件夾。 然后,由於您試圖包含“。”,將以某種方式發生此錯誤。 或“ ..”目錄。
在foreach周期開始時添加此代碼可解決此問題:
if (basename($file) === ".") { continue;}
if (basename($file) === "..") { continue; }
測試用例:
<?php
$archive = new ZipArchive();
$archive->open('c.zip',ZipArchive::CREATE);
$archive->addFile('a.txt');
$archive->addFile('b.txt');
$archive->addEmptyDir("../../down");
$archive->close();
$archive2 = new ZipArchive();
$archive2->open('c.zip');
$archive2->extractTo('here');
$archive2->close();
我僅在Windows上對此進行了測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.