function unzip_file($zipfile, $destination = '', $showstatus = true) { //Unzip one zip file to a destination dir //Both parameters must be FULL paths //If destination isn't specified, it will be the //SAME directory where the zip file resides. global $CFG; //Extract everything from zipfile $path_parts = pathinfo(cleardoubleslashes($zipfile)); $zippath = $path_parts["dirname"]; //The path of the zip file $zipfilename = $path_parts["basename"]; //The name of the zip file $extension = $path_parts["extension"]; //The extension of the file //If no file, error if (empty($zipfilename)) { return false; } //If no extension, error if (empty($extension)) { return false; } //Clear $zipfile $zipfile = cleardoubleslashes($zipfile); //Check zipfile exists if (!file_exists($zipfile)) { return false; } //If no destination, passed let's go with the same directory if (empty($destination)) { $destination = $zippath; } //Clear $destination $destpath = rtrim(cleardoubleslashes($destination), "/"); //Check destination path exists if (!is_dir($destpath)) { return false; } //Check destination path is writable. TODO!! //Everything is ready: // -$zippath is the path where the zip file resides (dir) // -$zipfilename is the name of the zip file (without path) // -$destpath is the destination path where the zip file will uncompressed (dir) $list = array(); require_once "{$CFG->libdir}/filelib.php"; do { $temppath = "{$CFG->dataroot}/temp/unzip/" . random_string(10); } while (file_exists($temppath)); if (!check_dir_exists($temppath, true, true)) { return false; } if (empty($CFG->unzip)) { // Use built-in php-based unzip function include_once "{$CFG->libdir}/pclzip/pclzip.lib.php"; $archive = new PclZip(cleardoubleslashes("{$zippath}/{$zipfilename}")); if (!($list = $archive->extract(PCLZIP_OPT_PATH, $temppath, PCLZIP_CB_PRE_EXTRACT, 'unzip_cleanfilename', PCLZIP_OPT_EXTRACT_DIR_RESTRICTION, $temppath))) { if (!empty($showstatus)) { notice($archive->errorInfo(true)); } return false; } } else { // Use external unzip program $separator = strtoupper(substr(PHP_OS, 0, 3)) === 'WIN' ? ' &' : ' ;'; $redirection = strtoupper(substr(PHP_OS, 0, 3)) === 'WIN' ? '' : ' 2>&1'; $command = 'cd ' . escapeshellarg($zippath) . $separator . escapeshellarg($CFG->unzip) . ' -o ' . escapeshellarg(cleardoubleslashes("{$zippath}/{$zipfilename}")) . ' -d ' . escapeshellarg($temppath) . $redirection; //All converted to backslashes in WIN if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { $command = str_replace('/', '\\', $command); } Exec($command, $list); } unzip_process_temp_dir($temppath, $destpath); fulldelete($temppath); //Display some info about the unzip execution if ($showstatus) { unzip_show_status($list, $temppath, $destpath); } return true; }
/** * Unzip one zip file to a destination dir * Both parameters must be FULL paths * If destination isn't specified, it will be the * SAME directory where the zip file resides. * @return boolean */ function unzip_file($zipfile, $destination = '', $showstatus = true) { global $CFG; //Extract everything from zipfile $path_parts = pathinfo(cleardoubleslashes($zipfile)); $zippath = $path_parts["dirname"]; //The path of the zip file $zipfilename = $path_parts["basename"]; //The name of the zip file $extension = $path_parts["extension"]; //The extension of the file //If no file, error if (empty($zipfilename)) { return false; } //If no extension, error if (empty($extension)) { return false; } //Clear $zipfile $zipfile = cleardoubleslashes($zipfile); //Check zipfile exists if (!file_exists($zipfile)) { return false; } //If no destination, passed let's go with the same directory if (empty($destination)) { $destination = $zippath; } //Clear $destination $destpath = rtrim(cleardoubleslashes($destination), "/"); //Check destination path exists if (!is_dir($destpath)) { return false; } //Check destination path is writable. TODO!! //Everything is ready: // -$zippath is the path where the zip file resides (dir) // -$zipfilename is the name of the zip file (without path) // -$destpath is the destination path where the zip file will uncompressed (dir) if (empty($CFG->unzip)) { // Use built-in php-based unzip function include_once "{$CFG->libdir}/pclzip/pclzip.lib.php"; $archive = new PclZip(cleardoubleslashes("{$zippath}/{$zipfilename}")); if (!($list = $archive->extract(PCLZIP_OPT_PATH, $destpath, PCLZIP_CB_PRE_EXTRACT, 'unzip_cleanfilename'))) { notice($archive->errorInfo(true)); return false; } } else { // Use external unzip program $separator = strtoupper(substr(PHP_OS, 0, 3)) === 'WIN' ? ' &' : ' ;'; $redirection = strtoupper(substr(PHP_OS, 0, 3)) === 'WIN' ? '' : ' 2>&1'; $command = 'cd ' . escapeshellarg($zippath) . $separator . escapeshellarg($CFG->unzip) . ' -o ' . escapeshellarg(cleardoubleslashes("{$zippath}/{$zipfilename}")) . ' -d ' . escapeshellarg($destpath) . $redirection; //All converted to backslashes in WIN if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { $command = str_replace('/', '\\', $command); } Exec($command, $list); } //Display some info about the unzip execution if ($showstatus) { unzip_show_status($list, $destpath); } return true; }