首页 > 解决方案 > PHP - 解压缩/打开返回整数

问题描述

我正在尝试从 zip 中提取 csv 文件,并且在以下代码中我总是得到一个整数而不是布尔值。

$zip = "path_to_zip/zip.zip";
if (file_exists($zip))
   {    
      echo "Extracting";
      $z = new ZipArchive;
      $res = $z->open($zip);

      var_dump($res);
      if ($res === TRUE)
         {
            $z->extractTo("my_path/");
            $z->close();
         }
       else
         {
            echo "failed";
         }
   }

zip 文件存在于指定位置,因为显示“正在提取”,但随后$res变量以整数形式返回 19,脚本以回显“失败”结束。

如果我跳过带有 的行$res === TRUE,我会收到以下消息:

Warning: ZipArchive::extractTo(): Invalid or uninitialized Zip object 

你看到这个对象有什么问题吗?

标签: phpunzip

解决方案


ZipArchive::open()返回bool|int(参见https://www.php.net/manual/en/ziparchive.open.php#refsect1-ziparchive.open-returnvalues)。

返回值是true或一个常量值。

如果绕过测试$res === TRUE$z则未准备好进行操作(“无效或未初始化的 Zip 对象”)。 你需要检查一下。

信息 19 是常量的值ZipArchive::ER_NOZIP(“不是 zip 存档。”)。所以,$zip不是一个有效的 zip 文件。

为了更好地查看错误状态,您可以执行以下操作:

$z = new ZipArchive;
$res = $z->open($zip);

if ($res !== true)
{
    switch($res) {
        case ZipArchive::ER_EXISTS: 
            echo 'File already exists.';
            break;
        case ZipArchive::ER_INCONS: 
            echo 'Zip archive inconsistent.';
            break;
        case ZipArchive::ER_INVAL: 
            echo 'Invalid argument.';
            break;
        case ZipArchive::ER_MEMORY: 
            echo 'Malloc failure.';
            break;
        case ZipArchive::ER_NOENT: 
            echo 'No such file.';
            break;
        case ZipArchive::ER_NOZIP: 
            $finfo = finfo_open(FILEINFO_MIME_TYPE);
            echo 'Not a zip archive but a ' . finfo_file($finfo, $zip);
            break;
        case ZipArchive::ER_OPEN: 
            echo 'Can\'t open file.';
            break;
        case ZipArchive::ER_READ: 
            echo 'Read error.';
            break;
        case ZipArchive::ER_SEEK: 
            echo 'Seek error.';
            break;
    }
}
else
{
    // do stuff
} 

推荐阅读