簡體   English   中英

ZipArchive無法解壓縮ZipArchive在PHP中壓縮的文件

[英]ZipArchive can't unzip files that ZipArchive zips in PHP

嘗試獲取導入/導出功能。

  1. 使用包含文件的文件夾
  2. 使用ZipArchive在PHP中壓縮文件夾
  3. 使用ZipArchive解壓縮壓縮的文件夾
  4. 創建了新文件夾,但缺少該文件

     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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM