The Unzipper is a PHP script that extracts .zip, .rar or .gz archives on webservers.
It detects .zip/.rar/.gz archives and let you choose which one to extract (if there are multiple archives available). It also supports creating Zip archives.
- It is useful if you not have access to a File-Manager, and you want to upload a lot of files (php framework or image collection) as archive.

• To download the script, click on this link: Download PHP Unzipper (79 KB).

Requirements

- PHP 5.3 and newer.
- PHP Rar extension (needed only if you want to extract Rar archive).

Usage

1. Copy the script code from this page, or Download it from the link above, and save it into a .php file on your server (unzipper.php).
2. Access the "unzipper.php" in your browser.
- To extract a Zip/Rar archive, it must be in the same folder where you have the "unzipper.php" file.
3. Choose .zip, .rar archive or .gz file you want to extract, and click on the "Unzip Archive" button.

PHP Unzipper script code

Click on the code to select it.
<?php
/**
 * The Unzipper extracts .zip or .rar archives and .gz files on webservers.
 * It also supports creating Zip archives.
 *
 * @author Andreas Tasch, at[tec], attec.at
 * @license GNU GPL v3
 * @version 0.1.0
*/
@set_time_limit(600);

define('VERSION', '0.1.0');
$timestart = microtime(TRUE);
$GLOBALS['status'] = array();
$unzipper = new Unzipper;

//Unzip Archive
if(isset($_POST['dounzip'])){
 //check if an archive was selected for unzipping
 $archive = isset($_POST['zipfile']) ? strip_tags($_POST['zipfile']) :'';
 $destination = isset($_POST['extpath']) ? strip_tags($_POST['extpath']) :'';
 $unzipper->prepareExtraction($archive, $destination);
}

//Create zip archive
if(isset($_POST['dozip'])){
 $zippath = !empty($_POST['zippath']) ? strip_tags($_POST['zippath']) :'.';
 // Resulting zipfile e.g. zipper--2016-07-23--11-55.zip
 $zipfile = 'zipper-'. date('Y-m-d--H-i') .'.zip';
 Zipper::zipDir($zippath, $zipfile);
}

$timeend = microtime(TRUE);
$time = $timeend - $timestart;

/**
 * Class Unzipper
 */
class Unzipper {
 public $localdir ='.';
 public $zipfiles = array();
 public function __construct(){
 //read directory and pick .zip and .gz files
 if($dh = opendir($this->localdir)){
 while (($file = readdir($dh)) !== FALSE){
 if(pathinfo($file, PATHINFO_EXTENSION)==='zip' || pathinfo($file, PATHINFO_EXTENSION)==='gz' || pathinfo($file, PATHINFO_EXTENSION)==='rar') $this->zipfiles[] = $file;
 }
 closedir($dh);
 if(!empty($this->zipfiles)) $GLOBALS['status'] = array('info'=>'.zip or .gz or .rar files found, ready for extraction');
 else $GLOBALS['status'] = array('info'=>'No .zip or .gz or rar files found. So only zipping functionality available.');
 }
 }

 // Prepare and check zipfile for extraction
 public function prepareExtraction($archive, $destination){
 // Determine paths.
 if(empty($destination)) $extpath = $this->localdir;
 else {
 $extpath = $this->localdir .'/'. $destination;
 // todo move this to extraction function
 if(!is_dir($extpath)) mkdir($extpath);
 }
 //allow only local existing archives to extract
 if(in_array($archive, $this->zipfiles)) self::extract($archive, $extpath);
 }

 //Checks file extension and calls suitable extractor functions
 public static function extract($archive, $destination){
 $ext = pathinfo($archive, PATHINFO_EXTENSION);
 switch($ext){
 case 'zip':
 self::extractZipArchive($archive, $destination);
 break;
 case 'gz':
 self::extractGzipFile($archive, $destination);
 break;
 case 'rar':
 self::extractRarArchive($archive, $destination);
 break;
 }
 }

 //Decompress/extract a zip archive using ZipArchive
 public static function extractZipArchive($archive, $destination){
 // Check if webserver supports unzipping.
 if(!class_exists('ZipArchive')){
 $GLOBALS['status'] = array('error'=>'Error: Your PHP version does not support unzip functionality.');
 return;
 }
 $zip = new ZipArchive;
 // Check if archive is readable.
 if($zip->open($archive)===TRUE){
 // Check if destination is writable
 if(is_writeable($destination .'/')){
 $zip->extractTo($destination);
 $zip->close();
 $GLOBALS['status'] = array('success'=>'Files unzipped successfully');
 }
 else $GLOBALS['status'] = array('error'=>'Error: Directory not writeable by webserver.');
 }
 else $GLOBALS['status'] = array('error'=>'Error: Cannot read .zip archive.');
 }

 // Decompress a .gz File
 public static function extractGzipFile($archive, $destination){
 // Check if zlib is enabled
 if(!function_exists('gzopen')){
 $GLOBALS['status'] = array('error'=>'Error: Your PHP has no zlib support enabled.');
 return;
 }
 $filename = pathinfo($archive, PATHINFO_FILENAME);
 $gzipped = gzopen($archive, 'rb');
 $file = fopen($filename, 'w');
 while($string = gzread($gzipped, 4096)) fwrite($file, $string, strlen($string));
 gzclose($gzipped);
 fclose($file);
 // Check if file was extracted.
 if(file_exists($destination .'/'. $filename)) $GLOBALS['status'] = array('success'=>'File unzipped successfully.');
 else $GLOBALS['status'] = array('error'=>'Error unzipping file.');
 }

 //Decompress/extract a Rar archive using RarArchive
 public static function extractRarArchive($archive, $destination){
 // Check if webserver supports unzipping.
 if(!class_exists('RarArchive')){
 $GLOBALS['status'] = array('error'=>'Error: Your PHP version does not support .rar archive functionality. <a class="info" href="http://php.net/manual/en/rar.installation.php" target="_blank">How to install RarArchive</a>');
 return;
 }
 // Check if archive is readable.
 if($rar = RarArchive::open($archive)){
 // Check if destination is writable
 if(is_writeable($destination .'/')){
 $entries = $rar->getEntries();
 foreach ($entries as $entry){
 $entry->extract($destination);
 }
 $rar->close();
 $GLOBALS['status'] = array('success'=>'Files extracted successfully.');
 }
 else $GLOBALS['status'] = array('error'=>'Error: Directory not writeable by webserver.');
 }
 else $GLOBALS['status'] = array('error'=>'Error: Cannot read .rar archive.');
 }
}

/**
 * Class Zipper
 *
 * Copied and slightly modified from http://at2.php.net/manual/en/class.ziparchive.php#110719
 * @author umbalaconmeogia
 */
class Zipper {
 /**
 * Add files and sub-directories in a folder to zip file.
 *
 * @param string $folder
 * Path to folder that should be zipped.
 *
 * @param ZipArchive $zipFile
 * Zipfile where files end up.
 *
 * @param int $exclusiveLength
 * Number of text to be exclusived from the file path.
 */
 private static function folderToZip($folder, &$zipFile, $exclusiveLength){
 $handle = opendir($folder);
 while(FALSE !== $f = readdir($handle)){
 // Check for local/parent path or zipping file itself and skip.
 if($f !='.' && $f != '..' && $f != basename(__FILE__)){
 $filePath = $folder .'/'. $f;
 // Remove prefix from file path before add to zip.
 $localPath = substr($filePath, $exclusiveLength);
 if(is_file($filePath)) $zipFile->addFile($filePath, $localPath);
 else if(is_dir($filePath)){
 // Add sub-directory.
 $zipFile->addEmptyDir($localPath);
 self::folderToZip($filePath, $zipFile, $exclusiveLength);
 }
 }
 }
 closedir($handle);
 }
 /**
 * Zip a folder (including itself).
 * Usage:
 * Zipper::zipDir('path/to/sourceDir', 'path/to/out.zip');
 *
 * @param string $sourcePath
 * Relative path of directory to be zipped.
 *
 * @param string $outZipPath
 * Relative path of the resulting output zip file.
 */
 public static function zipDir($sourcePath, $outZipPath){
 $pathInfo = pathinfo($sourcePath);
 $parentPath = $pathInfo['dirname'];
 $dirName = $pathInfo['basename'];
 $z = new ZipArchive();
 $z->open($outZipPath, ZipArchive::CREATE);
 $z->addEmptyDir($dirName);
 if($sourcePath == $dirName) self::folderToZip($sourcePath, $z, 0);
 else self::folderToZip($sourcePath, $z, strlen($parentPath.'/'));

 $z->close();
 $GLOBALS['status'] = array('success'=>'Successfully created archive '. $outZipPath);
 }
}
?>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>File Unzipper, Unrar + Zipper</title>
<style>
<!--
body {
font-family: Arial, sans-serif;
line-height: 150%;
}
label {
display: block;
margin-top: 20px;
}
fieldset {
border: 0;
background-color: #EEE;
margin: 10px 0 10px 0;
}
.select {
padding: 5px;
font-size: 110%;
}
.status {
margin: 0;
margin-bottom: 20px;
padding: 10px;
font-size: 80%;
background: #EEE;
border: 1px dotted #DDD;
}
.status--ERROR {
background-color: red;
color: white;
font-size: 120%;
}
.status--SUCCESS {
background-color: green;
font-weight: bold;
color: white;
font-size: 120%
}
.small {
font-size: 0.7rem;
font-weight: normal;
}
.version {
font-size: 80%;
}
.form-field {
border: 1px solid #AAA;
padding: 8px;
width: 280px;
}
.info {
margin-top: 0;
font-size: 80%;
color: #777;
}
.submit {
background-color: #378de5;
border: 0;
color: #ffffff;
font-size: 15px;
padding: 10px 24px;
margin: 20px 0 20px 0;
text-decoration: none;
}
.submit:hover {
background-color: #2c6db2;
cursor: pointer;
}
-->
</style>
</head>
<body>
<p class="status status--<?php echo strtoupper(key($GLOBALS['status'])); ?>">
 Status: <?php echo reset($GLOBALS['status']); ?><br/>
 <span class="small">Processing Time: <?php echo $time; ?> seconds</span>
</p>
<form action="" method="POST">
 <fieldset>
 <h1>Archive Unzipper</h1>
 <label for="zipfile">Select .zip or .rar archive or .gz file you want to extract:</label>
 <select name="zipfile" size="1" class="select">
<?php
foreach($unzipper->zipfiles as $zip) echo "<option>$zip</option>";
?>
 </select>
 <label for="extpath">Extraction path (optional):</label>
 <input type="text" name="extpath" class="form-field" />
 <p class="info">Enter extraction path without leading or trailing slashes (e.g. "mypath"). If left empty current directory will be used.</p>
 <input type="submit" name="dounzip" class="submit" value="Unzip Archive"/>
 </fieldset>
 <fieldset>
 <h1>Archive Zipper</h1>
 <label for="zippath">Path that should be zipped (optional):</label>
 <input type="text" name="zippath" class="form-field" />
 <p class="info">Enter path to be zipped without leading or trailing slashes (e.g. "zippath"). If left empty current directory will be used.</p>
 <input type="submit" name="dozip" class="submit" value="Zip Archive"/>
 </fieldset>
</form>
<p class="version">Unzipper version: <?php echo VERSION; ?></p>
</body>
</html>

Screenshot

• Scipt Page: github.com/ndeet/unzipper

Daily Test with Code Example

HTML
CSS
JavaScript
PHP-MySQL
Which tag create a highlighted bolded text?
<q> <strong> <em>
<p>Address: <strong>http://CoursesWeb.net/</strong> - Tutorials.</p>
Which of these CSS codes displays the text bolded?
text-size: 18px; font-style: italic; font-weight: 800;
#id {
  font-weight: 800;
}
What JavaScript function can be used to call another function multiple times, to a specified time interval?
setInterval() setTimeout() push()
function someFunction() { alert("CoursesWeb.net"); }
setInterval("someFunction()", 2000);
Click on the correctly defined variable in PHP.
var vname = 8; $vname = 8; $vname == 8;
$vname = 8;
echo $vname;
PHP Unzipper - Extract Zip, Rar Archives

Last accessed pages

  1. Butterfly Kyodai (34039)
  2. SHA1 Encrypt data in JavaScript (5869)
  3. List with Node.js Core Modules (2)
  4. Read Excel file data in PHP - PhpExcelReader (48544)
  5. Courses Web: PHP-MySQL JavaScript Ajax HTML CSS Flash-AS3 (59546)

Popular pages this month

  1. Qwop (7626)
  2. Drag Racer V3 (4432)
  3. Bubbles3 (1775)
  4. Flash Games - Free online Games (1614)
  5. Butterfly Kyodai (1288)