質問

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

役に立ちましたか?

解決

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;
     }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top