Search code examples
phpzipunzip

Extract sub folders of ZIP file in PHP


I am using a php script to unzip ZIP file. but this script unzip only one level of directories without extracting the sub directories of that file the script:

$zip = new ZipArchive;
if ($zip->open('test.zip') === TRUE) {
    $zip->extractTo('/my/destination/dir/');
    $zip->close();
    echo 'ok';
} else {
    echo 'failed';
}

for example: if the test.zip contains 2 folders: folder1\file.png, folder2\folder3\file3.png

after extracting this ZIP file, i only see the folder1*.* and folder2*.* but without the sub directory folder3.

How can i improve it?


Solution

  • I think this PHP manual will be helpful to you http://php.net/manual/en/ref.zip.php

    <?php
    $file = "2537c61ef7f47fc3ae919da08bcc1911.zip";
    $dir = getcwd();
    function Unzip($dir, $file, $destiny="")
    {
        $dir .= DIRECTORY_SEPARATOR;
        $path_file = $dir . $file;
        $zip = zip_open($path_file);
        $_tmp = array();
        $count=0;
        if ($zip)
        {
            while ($zip_entry = zip_read($zip))
            {
                $_tmp[$count]["filename"] = zip_entry_name($zip_entry);
                $_tmp[$count]["stored_filename"] = zip_entry_name($zip_entry);
                $_tmp[$count]["size"] = zip_entry_filesize($zip_entry);
                $_tmp[$count]["compressed_size"] = zip_entry_compressedsize($zip_entry);
                $_tmp[$count]["mtime"] = "";
                $_tmp[$count]["comment"] = "";
                $_tmp[$count]["folder"] = dirname(zip_entry_name($zip_entry));
                $_tmp[$count]["index"] = $count;
                $_tmp[$count]["status"] = "ok";
                $_tmp[$count]["method"] = zip_entry_compressionmethod($zip_entry);
    
                if (zip_entry_open($zip, $zip_entry, "r"))
                {
                    $buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
                    if($destiny)
                    {
                        $path_file = str_replace("/",DIRECTORY_SEPARATOR, $destiny . zip_entry_name($zip_entry));
                    }
                    else
                    {
                        $path_file = str_replace("/",DIRECTORY_SEPARATOR, $dir . zip_entry_name($zip_entry));
                    }
                    $new_dir = dirname($path_file);
    
                    // Create Recursive Directory (if not exist)  
                    if (!file_exists($new_dir)) {
                      mkdir($new_dir, 0700);
                    }
    
                    $fp = fopen($dir . zip_entry_name($zip_entry), "w");
                    fwrite($fp, $buf);
                    fclose($fp);
    
                    zip_entry_close($zip_entry);
                }
                echo "\n</pre>";
                $count++;
            }
    
            zip_close($zip);
        }
    }
    Unzip($dir,$file);
    ?>