Search code examples
phppermissionsphp-ziparchive

Extract a whole directory with zipArchive


I have a zip file with the following structure to extract with Php.

-/
 |- db_data.ini
 |- upload/
          |- aa/
               |- Many files here
          |- bb/
               |- Many files here
          |- cc/
               |- Many files here
          |- ETC.

In the upload folder there are many other folders containing a big quantity of files. What I need is to extract the upload directory to my website upload directory.

The code I'm using for that is the following:

$zip = new ZipArchive();
if ($zip->open($input_filename) !== TRUE) throw new Exception('Could not open the zip file !');
$zip->extractTo('/upload/', '/upload/');
$zip->close();

I've chmod(ed) the directory to 0777 but it keeps throwing me a Permission denied on the extractTo line.

Did I make something wrong or did I miss the usage of extractTo ?

Thanks for your help


Solution

  • Please check in your phpinfo() output whether the extension has been installed or not.

    You could do something like this:

    • Extract Zip file to a temp location.

    • Scan through it and move(copy) all the files to portfolio folder.

    • Delete the temp folder and its all contents (created in Step 1).

    Code:

    //Step 01
    $zip = new ZipArchive();
    $zip->open($_FILES['zip']['tmp_name']);
    $zip->extractTo('temp/user');
    $zip->close();
    
     //Define directories
    $userdir = "user/portfolio"; // Destination
    $dir = "temp/user";          //Source
    
     //Step 02
    // Get array of all files in the temp folder, recursivly
    $files = dirtoarray($dir);
    
    // Cycle through all source files to copy them in Destination
    foreach ($files as $file) {
        copy($dir.$file, $userdir.$file);
    }
    
     //Step 03
    //Empty the dir
    recursive_directory_delete($dir);
    
     // Functions Code follows..
    //to get all the recursive paths in a array
    function dirtoarray($dir, $recursive) {
        $array_items = array();
        if ($handle = opendir($dir)) {
            while (false !== ($file = readdir($handle))) {
                if ($file != "." && $file != "..") {
                    if (is_dir($dir. "/" . $file)) {
                        if($recursive) {
                            $array_items = array_merge($array_items, dirtoarray($dir. "/" . $file, $recursive));
                        }
                    } else {
                        $file = $dir . "/" . $file;
                        $array_items[] = preg_replace("/\/\//si", "/", $file);
                    }
                }
            }
            closedir($handle);
        }
        return $array_items;
    }
    
    // Empty the dir
    function recursive_directory_delete($dir)
    {
         // if the path has a slash at the end we remove it here
         if(substr($directory,-1) == '/')
         {
              $directory = substr($directory,0,-1);
         }
    
         // if the path is not valid or is not a directory ...
         if(!file_exists($directory) || !is_dir($directory))
         {
              // ... we return false and exit the function
              return FALSE;
    
         // ... if the path is not readable
         }elseif(!is_readable($directory))
         {
              // ... we return false and exit the function
              return FALSE;
    
         // ... else if the path is readable
         }else{
    
              // we open the directory
              $handle = opendir($directory);
    
              // and scan through the items inside
              while (FALSE !== ($item = readdir($handle)))
              {
                   // if the filepointer is not the current directory
                   // or the parent directory
                   if($item != '.' && $item != '..')
                   {
                        // we build the new path to delete
                        $path = $directory.'/'.$item;
    
                        // if the new path is a directory
                        if(is_dir($path))
                        {
                             // we call this function with the new path
                             recursive_directory_delete($path);
    
                        // if the new path is a file
                        }else{
                             // we remove the file
                             unlink($path);
                        }
                   }
              }
              // close the directory
              closedir($handle);
    
              // return success
              return TRUE;
         }
    }