【问题标题】:PHP - unzip / open returns integerPHP - 解压缩/打开返回整数
【发布时间】:2021-05-14 23:37:26
【问题描述】:

我正在尝试从 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";
         }
   }

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

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

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

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

【问题讨论】:

    标签: php unzip


    【解决方案1】:

    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
    } 
    

    【讨论】:

    • 谢谢,这很奇怪,因为如果我手动解压缩 zip 文件,它就可以工作。尺寸会是个问题吗?
    • 我不这么认为。您确定它是真正的 zip,还是其他带有 .zip 扩展名的存档格式? $finfo = finfo_open(FILEINFO_MIME_TYPE);echo finfo_file($finfo, $zip); 返回什么?
    • 啊!这是一个很好的猜测,它返回 application/x-gzip,而我从中检索它的 Web 服务指定了 zip。我会检查是否可以获得该文件的另一个版本。感谢您为我指明正确的方向。
    • 完成 :) 提供 zip 的公司肯定存在问题,无论我选择哪种类型的文件,它始终是 gzip。我会调整我的剧本,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多