Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
/**
 * 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;
}