【问题标题】:zip_close() expects parameter 1 to be resource, object given on line 37zip_close() 期望参数 1 是资源,第 37 行给出的对象
【发布时间】:2018-07-11 11:19:34
【问题描述】:

我正在创建一个文件来提取 zip 文件。代码片段检查文件扩展名是否为 .zip,然后检查文件是否已存在。如果没有,请提取存档。

    if($fileExtension == "zip")
{
    if(is_dir("unzips/".$fileName) == false)
    {
        move_uploaded_file($_FILES["file"]["tmp_name"],"temp/".$_FILES["file"]["name"]);

        $zip = new ZipArchive();
        $zip -> open("temp/".$_FILES["file"]["name"]);

        for($num = 0; $num < $zip->numFiles; $num++)
        {
            $fileInfo = $zip->statIndex($num);
            echo "Successfully Extracted: ".$fileInfo["name"];
            $zip->extractTo("unzips/".$fileName);
            echo "<br />";
        }

        zip_close($zip);

        unlink("temp/".$_FILES["file"]["name"]);
    }
    else
    {
        echo $fileName." The ZIP archive file has already been unzipped";
    }
}
else
{
    echo "Only .zip files are allowed";
}

这里是 index.php 的完整代码

    <!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Unzipping Zip File</title>
</head>

<body>
<form action="index.php" method="POST" enctype="multipart/form-data">
    <input type="file" name="file"><input type="submit" name="submit" value="Extract">
</form>

<?php

if(isset($_POST['submit']))
{
    $array = explode(".",$_FILES["file"]["name"]);
    $fileName = $array[0];
    $fileExtension = strtolower(end($array));

    if($fileExtension == "zip")
    {
        if(is_dir("unzips/".$fileName) == false)
        {
            move_uploaded_file($_FILES["file"]["tmp_name"],"temp/".$_FILES["file"]["name"]);
            $zip = new ZipArchive();
            $zip -> open("temp/".$_FILES["file"]["name"]);

            for($num = 0; $num < $zip->numFiles; $num++)
            {
                $fileInfo = $zip->statIndex($num);
                echo "Successfully Extracted: ".$fileInfo["name"];
                $zip->extractTo("unzips/".$fileName);
                echo "<br />";
            }

            $zip -> close();

            unlink("temp/".$_FILES["file"]["name"]);
        }
        else
        {
            echo $fileName." The ZIP archive file has already been unzipped";
        }
    }
    else
    {
        echo "Only .zip files are allowed";
    }
}

?>

<br />
<p id="end note">Please return to main menu and download individually extracted files.</p>
</body>
</html>

目录结构如下: D:/MyWebs/extracting/index.php D:/MyWebs/extracting/unzips(包含解压文件夹的最终目的地) D:/MyWebs/extracting/temp(存储 zip 然后删除它们)

【问题讨论】:

  • 使用 $zip->close();而是因为 zip_close() 接受使用 zip_open() 打开的资源 zip 文件;
  • 您的代码中还有另一个问题。您正在将无效值设置为 $fileName,(当您将其设置为 $fileName = $array[0]; 时,您缺少其中的扩展名)。因此打开 zip 文件将失败。请参阅我的更新答案。

标签: php php-zip-archive


【解决方案1】:

void zip_close (资源 $zip)

压缩

A ZIP file previously opened with zip_open().

http://php.net/manual/en/function.zip-close.php

$zipZipArchive() 类的一个实例。因此,您不能将其传递给 zip_close(),因为它需要使用 zip_open() 创建的资源。

.................................................. ....................

编辑:我注意到在您添加完整源代码后,您的代码中还有另一个错误。

您为$fileName 变量设置了无效值。

$array = explode(".",$_FILES["file"]["name"]);
$fileName = $array[0];

当您分解$_FILES["file"]["name"] 并仅获得$array[0] 值时,您仅获得文件的名称(没有扩展名)。

所以当你传递一个无效的路径给$zip-&gt;open($fileName);方法时,它会返回一个错误:

ZipArchive::close(): Zip 对象无效或未初始化

将上面的内容改为:

$array = explode(".",$_FILES["file"]["name"]);
$extractDir = $array[0];
$fileName = $_FILES["file"]["name"];
$fileExtension = strtolower(end($array));

if(is_dir("unzips/".$extractDir) == false){
   .
   .
   $zip->extractTo("unzips/".$extractDir);
   .
   .
}

这会奏效。 希望对你有帮助:)

【讨论】:

    【解决方案2】:

    zip_close() 期望参数 1 是资源,给定对象

    错误信息一目了然。

    documentation of zip_close() 表示zip_close() 期望的参数应该是:

    以前使用zip_open() 打开的 ZIP 文件。

    由于您使用的是ZipArchive 对象,因此您必须使用它的方法来处理它。特别是,ZipArchive::close() 是用于关闭 ZipArchive 的方法(之前使用 ZipArchive::open() 打开)。

    您的代码应如下所示:

    $zip = new ZipArchive();
    $zip->open("temp/".$_FILES["file"]["name"]);
    
    // Do whatever you want with the content of the archive here (extract files, f.e.)
    
    $zip->close();
    

    【讨论】:

      猜你喜欢
      • 2011-09-23
      • 2015-08-24
      • 2015-09-23
      • 2011-06-05
      • 2011-03-26
      • 2012-01-21
      • 1970-01-01
      • 1970-01-01
      • 2018-01-05
      相关资源
      最近更新 更多