zip_close() ожидает, что параметр 1 будет ресурсом, объект указан в строке 37.

Я создаю файл для извлечения 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, а затем удаляет их)


person Vipul Sachdeva    schedule 11.07.2018    source источник
comment
используйте $zip-›close(); вместо этого, потому что zip_close() принимает zip-файл ресурса, открытый с помощью zip_open();   -  person Nimeshka Srimal    schedule 11.07.2018
comment
У вас есть еще одна проблема в вашем коде. Вы устанавливаете недопустимое значение $fileName (когда вы получаете его как $fileName = $array[0];, вам не хватает расширения). поэтому открытие zip-файла не удастся. Смотрите мой обновленный ответ.   -  person Nimeshka Srimal    schedule 11.07.2018


Ответы (2)


недействительным zip_close (ресурс $zip)

архив

A ZIP file previously opened with zip_open().

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

$zip является экземпляром класса ZipArchive(). Таким образом, вы не можете передать это zip_close(), так как он ожидает ресурс, созданный с помощью zip_open().

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

EDIT: я заметил, что у вас есть еще одна ошибка в вашем коде после того, как вы добавили полный исходный код.

Вы установили недопустимое значение для переменной $fileName.

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

Когда вы взрываете $_FILES["file"]["name"] и получаете только значение $array[0], вы получаете только имя файла (без расширения).

Поэтому, когда вы передаете недопустимый путь методу $zip->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);
   .
   .
}

Это сработает. Надеюсь, поможет :)

person Nimeshka Srimal    schedule 11.07.2018

zip_close() ожидает, что параметр 1 будет ресурсом, заданным объектом

Сообщение об ошибке говорит само за себя.

В документации zip_close() говорится, что аргумент, ожидаемый zip_close(), должен быть:

ZIP-файл, ранее открытый с помощью zip_open().

Поскольку вы используете объект 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();
person axiac    schedule 11.07.2018