How to extract php file

I can only assume your code came from a tutorial somewhere online? In that case, good job trying to figure it out by yourself. On the other hand, the fact that this code could actually be published online somewhere as the correct way to unzip a file is a bit frightening.

PHP has built-in extensions for dealing with compressed files. There should be no need to use system calls for this. ZipArchivedocs is one option.

$zip = new ZipArchive;
$res = $zip->open('file.zip');
if ($res === TRUE) {
  $zip->extractTo('/myzips/extract_path/');
  $zip->close();
  echo 'woot!';
} else {
  echo 'doh!';
}

Also, as others have commented, $HTTP_GET_VARS has been deprecated since version 4.1 ... which was a reeeeeally long time ago. Don't use it. Use the $_GET superglobal instead.

Finally, be very careful about accepting whatever input is passed to a script via a $_GET variable.

ALWAYS SANITIZE USER INPUT.


UPDATE

As per your comment, the best way to extract the zip file into the same directory in which it resides is to determine the hard path to the file and extract it specifically to that location. So, you could do:

// assuming file.zip is in the same directory as the executing script.
$file = 'file.zip';

// get the absolute path to $file
$path = pathinfo(realpath($file), PATHINFO_DIRNAME);

$zip = new ZipArchive;
$res = $zip->open($file);
if ($res === TRUE) {
  // extract it to the path we determined above
  $zip->extractTo($path);
  $zip->close();
  echo "WOOT! $file extracted to $path";
} else {
  echo "Doh! I couldn't open $file";
}

php-dev at proneticas dot net

11 years ago

If you want to copy one file at a time and remove the folder name that is stored in the ZIP file, so you don't have to create directories from the ZIP itself, then use this snippet (basically collapses the ZIP file into one Folder).

$path

= 'zipfile.zip'$zip = new ZipArchive;
if (
$zip->open($path) === true) {
    for(
$i = 0; $i < $zip->numFiles; $i++) {
       
$filename = $zip->getNameIndex($i);
       
$fileinfo = pathinfo($filename);
       
copy("zip://".$path."#".$filename, "/your/new/destination/".$fileinfo['basename']);
    }                  
   
$zip->close();                  
}
?>

* On a side note, you can also use $_FILES['userfile']['tmp_name'] as the $path for an uploaded ZIP so you never have to move it or extract a uploaded zip file.

Cheers!

ProNeticas Dev Team

Anonymous

4 years ago

If you want to extract the files just to the current folder, simply use
$zip->extractTo(".");

It took me hours to figure this out.

stanislav dot eckert at vizson dot de

7 years ago

The extractTo() method does not offer any parameter to allow extracting files and folders recursively from another (parent) folder inside the ZIP archive. With the following method it is possible:

  class my_ZipArchive extends ZipArchive
 
{
    public function
extractSubdirTo($destination, $subdir)
    {
     
$errors = array();// Prepare dirs
     
$destination = str_replace(array("/", "\\"), DIRECTORY_SEPARATOR, $destination);
     
$subdir = str_replace(array("/", "\\"), "/", $subdir);

      if (

substr($destination, mb_strlen(DIRECTORY_SEPARATOR, "UTF-8") * -1) != DIRECTORY_SEPARATOR)
       
$destination .= DIRECTORY_SEPARATOR;

      if (

substr($subdir, -1) != "/")
       
$subdir .= "/";// Extract files
     
for ($i = 0; $i < $this->numFiles; $i++)
      {
       
$filename = $this->getNameIndex($i);

        if (

substr($filename, 0, mb_strlen($subdir, "UTF-8")) == $subdir)
        {
         
$relativePath = substr($filename, mb_strlen($subdir, "UTF-8"));
         
$relativePath = str_replace(array("/", "\\"), DIRECTORY_SEPARATOR, $relativePath);

          if (

mb_strlen($relativePath, "UTF-8") > 0)
          {
            if (
substr($filename, -1) == "/"// Directory
           
{
             
// New dir
             
if (!is_dir($destination . $relativePath))
                if (!@
mkdir($destination . $relativePath, 0755, true))
                 
$errors[$i] = $filename;
            }
            else
            {
              if (
dirname($relativePath) != ".")
              {
                if (!
is_dir($destination . dirname($relativePath)))
                {
                 
// New dir (for file)
                 
@mkdir($destination . dirname($relativePath), 0755, true);
                }
              }
// New file
             
if (@file_put_contents($destination . $relativePath, $this->getFromIndex($i)) === false)
               
$errors[$i] = $filename;
            }
          }
        }
      }

      return

$errors;
    }
  }
?>

Example:
  echo "
";$zip = new my_ZipArchive();
  if (
$zip->open("test.zip") === TRUE)
  {
   
$errors = $zip->extractSubdirTo("C:/output", "folder/subfolder/");
   
$zip->close();

    echo

'ok, errors: ' . count($errors);
  }
  else
  {
    echo
'failed';
  }
?>

cucurella at gmail dot com

1 year ago

// Handling ERROR file by file !!

$ERROR_UNZIP

= false;
$dest = "../";
$zipfile = "test.zip";$zip = new ZipArchive;

if (

$zip->open("$zipfile") === true) {

        for (

$i = 0; $i < $zip -> numFiles; $i++) {
       
$RETVAL = false;$filename = $zip->getNameIndex($i);$RETVAL = $zip->extractTo($dest,$filename);

        if (

$RETVAL) {
            print
"$filename ... [ OK ]
"
;
        } else {
            print
"$filename ... [ ERROR ]
"
;
           
$ERROR_UNZIP = true;
        }
    }
// close
   
$zip -> close();// retval
   
if ($ERROR_UNZIP) {
        print
"

ERROR unziping ${zipfile}

"
;
    } else {
        print
"

Unzip OK

"
;
    }
} else {
    print
"

ERROR opening ${zipfile}

"
;
}
?>

skrzypecki at gmail dot com

5 years ago

Please note that the path can not be to long! I am not sure what the maximum length is, didnt find any information about that. But i kept getting issues when using extractTo().

Than after google i found this little comment: https://github.com/composer/composer/issues/2824#issuecomment-308201902

CopyPasted comment:
===
I had this path in my machine:

C:/xampp5.0/htdocs/project-recordando-symfony/project-recordando-symfony
Then I ran composer install or/and composer update and it returned this error:

ErrorException ZipArchive::extractTo...

That error is because your path is too much long, I changed to:

C:/xampp5.0/htdocs/p-symfony/*
and worked!
===

synnus at gmail dot com

5 years ago

// This version allows to see which file will be decompressed and to keep
    // a follow-up on decompression
define( 'FILEPATH',     dirname(__FILE__)     . '\\' );
   
define( 'TEST',         FILEPATH             . 'test\\' );$za = new ZipArchive();$za->open(FILEPATH . 'test.zip');
print_r($za);
var_dump($za);
echo
"Nombre de fichiers : " . $za->numFiles . "\n";
echo
"Statut : " . $za->status  . "\n";
echo
"Statut du système : " . $za->statusSys . "\n";
echo
"Nom du fichier : " . $za->filename . "\n";
echo
"Commentaire : " . $za->comment . "\n";/*  in $za->statIndex($i)

    [name] => data/x.luac
    [index] => 451
    [crc] => -1266183263
    [size] => 2936
    [mtime] => 1464790482
    [comp_size] => 976
    [comp_method] => 8
*/

for ($i=0; $i<$za->numFiles;$i++) {
    echo
"index : $i\n";
   
$name = $za->statIndex($i)['name'];
   
$size = $za->statIndex($i)['size'];
   
$comp_size = $za->statIndex($i)['comp_size'];
   
print_r($name . ' [ ' . $size . '>' . $comp_size . ']' );
   
$za->extractTo(TEST,$name);
}
echo
"Nombre de fichiers :" . $za->numFiles . "\n";    ?>

kawzaki at yahoo dot com

13 years ago

Please be aware of the fact that using this function has OVERWRITE true.

an old file will be overwritten if the achieve (zipped file) contains file matching the same old file name.

old files that has no match in the zip, will be kept as is.

hopefully the someone will explain how to avoid overwriting old files.

quake2005 at gmail dot com

12 years ago

If you want to extract one file at a time, you can use this:

$path

= 'zipfile.zip'$zip = new ZipArchive;
if (
$zip->open($path) === true) {

                        for(

$i = 0; $i < $zip->numFiles; $i++) {$zip->extractTo('path/to/extraction/', array($zip->getNameIndex($i)));// here you can run a custom function for the particular extracted file}$zip->close();

                    }

?>

cory dot mawhorter at ephective dot com

12 years ago

This function will flatten a zip file using the ZipArchive class. 

It will extract all the files in the zip and store them in a single destination directory.  That is, no sub-directories will be created.

If anyone knows a better way to determine if an entry is a directory, please chime in.  I feel dirty checking for a trailing slash.

// dest shouldn't have a trailing slash
function zip_flatten ( $zipfile, $dest='.' )
{
   
$zip = new ZipArchive;
    if (
$zip->open( $zipfile ) )
    {
        for (
$i=0; $i < $zip->numFiles; $i++ )
        {
           
$entry = $zip->getNameIndex($i);
            if (
substr( $entry, -1 ) == '/' ) continue; // skip directories $fp = $zip->getStream( $entry );
           
$ofp = fopen( $dest.'/'.basename($entry), 'w' );

                        if ( !

$fp )
                throw new
Exception('Unable to extract the file.');

                        while ( !

feof( $fp ) )
               
fwrite( $ofp, fread($fp, 8192) ); fclose($fp);
           
fclose($ofp);
        }
$zip->close();
    }
    else
        return
false;

        return

$zip;
}
/*
Example Usage:

zip_flatten( 'test.zip', 'my/path' );
*/

?>

[EDIT BY danbrown AT php DOT net: Added $zip-close() per indication by original poster in follow-up note on 18-APR-2010.]

sachinyadav at live dot com

11 years ago

This script will search for ".txt" file(any file name) inside test.zip archive. Suppose, 'example.txt' file is found then the script will copy 'example.txt' to "txt_files" directory and rename it to 'test.zip.txt' and will remove all the blank lines from 'test.zip.txt' and resave and will exit the loop without searching remaining entries.
This script can be useful to extract .DIZ and GIF files to display ZIP archive details in your script.
   $value="test.zip";
  
$filename="zip_files/$value";
  
$zip = new ZipArchive;
     if (
$zip->open($filename) === true) {
      echo
"Generating TEXT file.";
          for(
$i = 0; $i < $zip->numFiles; $i++) {
            
$entry = $zip->getNameIndex($i);
               if(
preg_match('#\.(txt)$#i', $entry))
                {
               
////This copy function will move the entry to the root of "txt_files" without creating any sub-folders unlike "ZIP->EXTRACTO" function.
               
copy('zip://'.dirname(__FILE__).'/zip_files/'.$value.'#'.$entry, 'txt_files/'.$value.'.txt');
               
$content = file_get_contents("txt_files/$value.txt");
               
$newcontent = preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $content);
               
file_put_contents("txt_files/$value.txt", "$newcontent");
                break;
                }
              } 
            
$zip->close();
            }
    else{
         echo
"ZIP archive failed";
        }
?>

enjoy PHP programming.
Sachin Yadav

tBone

14 years ago

This function, at least from my experience, maintains/forces the directory structure within the ZIP file.

ie. if you have FOLDER1/File1.txt in the zip file and you use
$zip->extractTo('/extract', 'FOLDER1/File1.txt');
the location of the extracted file will be:
/extract/FOLDER1/File1.txt

ben dot tyger at tygerclan dot net

6 years ago

Note, in Linux (possibly other *nix platforms too) there is no way to extract hidden files ( aka filename starting with a '.') from a Zip archive.

ohcc at 163 dot com

5 years ago

WARNING!!!!

if you are running php under Apache, a .htaccess file inside the zip file may fail the extractTo() method.

Anonymous

13 years ago

I found it useful to add this to a function.

/**
*  Extracts a ZIP archive to the specified extract path
*
*  @param string $file The ZIP archive to extract (including the path)   
*  @param string $extractPath The path to extract the ZIP archive to
*
*  @return boolean TURE if the ZIP archive is successfully extracted, FALSE if there was an errror

*/
function zip_extract($file, $extractPath) {$zip = new ZipArchive;
   
$res = $zip->open($file);
    if (
$res === TRUE) {
       
$zip->extractTo($extractPath);
       
$zip->close();
        return
TRUE;
    } else {
        return
FALSE;
    }

}

// end function
?>

Anonymous

12 years ago

I am using this function to extract a specific folder and it's contents from a zip file:

function extractDir($zipfile, $path) {
  if (
file_exists($zipfile)) {
   
$files = array();
   
$zip = new ZipArchive;
    if (
$zip->open($zipfile) === TRUE) {
      for(
$i = 0; $i < $zip->numFiles; $i++) {
       
$entry = $zip->getNameIndex($i);
       
//Use strpos() to check if the entry name contains the directory we want to extract
       
if (strpos($entry, "/MyFolder/")) {
         
//Add the entry to our array if it in in our desired directory
         
$files[] = $entry;
        }
      }
     
//Feed $files array to extractTo() to get only the files we want
     
if ($zip->extractTo($path, $files) === TRUE) {
        return
TRUE;
      } else {
        return
FALSE;
      }
     
$zip->close();
    } else {
      return
FALSE;
    }
  } else {
    return
FALSE;
  }
}
//Run the function
if (extractDir($zipfile, $path)) {
 
$extracted = "YES! :-D";
} else {
 
$extracted = "NO! :*(";
}

echo

$extracted;
?>

icixtec at gmail dot com

2 years ago

Para casos donde sea necesario descomprimir archivos sin saber si el nombre está en mayúsculas o minúsculas:

$zip = new ZipArchive;
if ($zip->open('myfile.zip') === TRUE) {
    //no funciona
    //$zip->extractTo('./', array( 'file1.XML', 'file1.xml'));
    //funciona
    $zip->extractTo('./', 'file1.XML' );
    $zip->extractTo('./', 'file1.xml' );
    $zip->close();
}

How do you extract a file?

To unzip a single file or folder, open the zipped folder, then drag the file or folder from the zipped folder to a new location. To unzip all the contents of the zipped folder, press and hold (or right-click) the folder, select Extract All, and then follow the instructions.

How are PHP files saved?

Save and open the file in the browser. Go to File > Save As… and save the file as "helloworld2. php", and open it in your browser by using the address: http://localhost/helloworld2.php. The output is the same as before, but this time the text is in bold.

How can I download URL from PHP?

Steps to download the file:.
Initialize a file URL to the variable..
Create cURL session..
Declare a variable and store the directory name where the downloaded file will save..
Use the basename() function to return the file basename if the file path is provided as a parameter..
Save the file to the given location..

What is a PHP file give example?

Generally speaking, a PHP file is a plain-text file which contains code written in the PHP programming language. Since PHP is a server-side (back-end) scripting language, the code written in the PHP file is executed on the server.