2

当使用 php zip 类提取 zip 文件时(实际上它很糟糕,但谁知道呢?),

  $ unzip -t 1.zip 
    file #47:  bad zipfile offset (local header sig):  574665
    ...
    At least one error was detected in 1.zip.

    <?php
    function unzip($apkpath, $dirname) { //
        $zip = new ZipArchive;
        $res = $zip->open($apkpath);
        if ($res === TRUE) {
            $zip->extractTo($dirname);
            $zip->close();
            return true;
        } else {
            return false;
        }
    }
    unzip('com.nd.sms.zip', '2');  // It's ok
    //unzip('1.zip', '2');            //this line go into infinite loop and very heigh cpu
    unzip('com.nd.sms.zip', '2');
    ?>

任何人都知道如何安全地使用 ZipArchive,或其他扩展替换,或某种方式来检查 zip 文件是否有效? 另外,我用的是php5.3.14+ubuntu。
我知道, https ://bugs.php.net/bug.php?id=53230 https://bugs.php.net/bug.php?id=57905

4

2 回答 2

0
function zipValid($path) {
  $zip = zip_open($path);
  if (is_resource($zip)) {
    // valid zip
    zip_close($zip);
    return true;
  }
else 
return false;

其他方式

  1. 您可以检查 zip 文件的长度与其标题中的长度,但这可能无助于检测损坏的文件。您需要计算 zip 的 CRC 并将其与原始 CRC 进行比较才能确定。但是,您可能无法使用原始 CRC。

  2. 如果它是您正在执行此操作的本地系统,则可以使用 PHP exec函数并传递参数以直接使用 unzip 可执行文件。

于 2012-07-21T10:14:07.757 回答
0
function unzip($apkpath, $dirname) {
    exec('unzip -t '.$apkpath.'>/dev/null 2>&1', $out, $return);
    if($return === 0)
    {
        $zip = new ZipArchive;
        $res = $zip->open($apkpath);
        if ($res === TRUE) {
            $zip->extractTo($dirname);
            $zip->close();
            return true;
        } else {
            return false;
        }
    }
    return false;
}

好吧,它可以工作。但我不认为它是提取 zip 的好解决方案,无论文件数据验证如何。

于 2012-07-22T13:57:25.487 回答