From bda2fc3eb7721640b8b4ad8cbef3e66b7da4b023 Mon Sep 17 00:00:00 2001 From: Andreas Tasch Date: Sat, 23 Jul 2016 14:54:45 +0200 Subject: [PATCH] Adding zipping functionality + refactor status messages. --- unzipper.php | 205 +++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 156 insertions(+), 49 deletions(-) diff --git a/unzipper.php b/unzipper.php index 1244796..1d525c7 100644 --- a/unzipper.php +++ b/unzipper.php @@ -1,19 +1,34 @@ prepareExtraction($archive, $destination); +} + +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; @@ -41,32 +56,30 @@ public function __construct() { closedir($dh); if (!empty($this->zipfiles)) { - self::$status = '.zip or .gz or .rar files found, ready for extraction'; + $GLOBALS['status'] = array('info' => '.zip or .gz or .rar files found, ready for extraction'); } else { - self::$status = 'Error: No .zip or .gz or rar files found.'; + $GLOBALS['status'] = array('info' => 'No .zip or .gz or rar files found. So only zipping functionality available.'); } } + } - //check if an archive was selected for unzipping - //check if archive has been selected - $input = isset($_POST['zipfile']) ? strip_tags($_POST['zipfile']) : ''; - $destination = isset($_POST['extpath']) ? strip_tags($_POST['extpath']) : ''; - //allow only local existing archives to extract - if ($input !== '') { - if (empty($destination)) { - $extpath = $this->localdir; - } - else { - $extpath = $this->localdir . '/' . $destination; - if (!is_dir($extpath)) { - mkdir($extpath); - } - } - if (in_array($input, $this->zipfiles)) { - self::extract($input, $extpath); + 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); + } } /** @@ -100,7 +113,7 @@ public static function extract($archive, $destination) { public static function extractZipArchive($archive, $destination) { // Check if webserver supports unzipping. if (!class_exists('ZipArchive')) { - self::$status = 'Error: Your PHP version does not support unzip functionality.'; + $GLOBALS['status'] = array('error' => 'Error: Your PHP version does not support unzip functionality.'); return; } @@ -112,14 +125,14 @@ public static function extractZipArchive($archive, $destination) { if (is_writeable($destination . '/')) { $zip->extractTo($destination); $zip->close(); - self::$status = 'Files unzipped successfully'; + $GLOBALS['status'] = array('success' => 'Files unzipped successfully'); } else { - self::$status = 'Error: Directory not writeable by webserver.'; + $GLOBALS['status'] = array('error' => 'Error: Directory not writeable by webserver.'); } } else { - self::$status = 'Error: Cannot read .zip archive.'; + $GLOBALS['status'] = array('error' => 'Error: Cannot read .zip archive.'); } } @@ -132,7 +145,7 @@ public static function extractZipArchive($archive, $destination) { public static function extractGzipFile($archive, $destination) { // Check if zlib is enabled if (!function_exists('gzopen')) { - self::$status = 'Error: Your PHP has no zlib support enabled.'; + $GLOBALS['status'] = array('error' => 'Error: Your PHP has no zlib support enabled.'); return; } @@ -148,10 +161,10 @@ public static function extractGzipFile($archive, $destination) { // Check if file was extracted. if (file_exists($destination . '/' . $filename)) { - self::$status = 'File unzipped successfully.'; + $GLOBALS['status'] = array('success' => 'File unzipped successfully.'); } else { - self::$status = 'Error unzipping file.'; + $GLOBALS['status'] = array('error' => 'Error unzipping file.'); } } @@ -165,7 +178,7 @@ public static function extractGzipFile($archive, $destination) { public static function extractRarArchive($archive, $destination) { // Check if webserver supports unzipping. if (!class_exists('RarArchive')) { - self::$status = 'Error: Your PHP version does not support .rar archive functionality. How to install RarArchive'; + $GLOBALS['status'] = array('error' => 'Error: Your PHP version does not support .rar archive functionality. How to install RarArchive'); return; } // Check if archive is readable. @@ -177,25 +190,96 @@ public static function extractRarArchive($archive, $destination) { $entry->extract($destination); } $rar->close(); - self::$status = 'Files extracted successfully'; + $GLOBALS['status'] = array('success' => 'Files extracted successfully.'); } else { - self::$status = 'Error: Directory not writeable by webserver.'; + $GLOBALS['status'] = array('error' => 'Error: Directory not writeable by webserver.'); } } else { - self::$status = 'Error: Cannot read .rar archive.'; + $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 + * @param ZipArchive $zipFile + * @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); + } elseif (is_dir($filePath)) { + // Add sub-directory. + $zipFile->addEmptyDir($localPath); + self::folderToZip($filePath, $zipFile, $exclusiveLength); + } + } + } + closedir($handle); + } + + /** + * Zip a folder (include 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); + } +} + +class Status { + public static $messages = array(); +} + ?> - File Unzipper + File Unzipper + Zipper -

Archive Unzipper

+

+ Status:
+ Processing Time: seconds +

+

Archive Unzipper

-

Enter extraction path without leading or trailing slashes (e.g. "mypath"). If left blank current directory will be used.

- +

Enter extraction path without leading or trailing slashes (e.g. "mypath"). If left empty current directory will be used.

+ +
+ +
+

Archive Zipper

+ + +

Enter path to be zipped without leading or trailing slashes (e.g. "zippath"). If left empty current directory will be used.

+
-

- Status:
- Processing Time: ms -

+

Unzipper version: