/** * Unzips a specified ZIP file to a location on the Filesystem via the WordPress Filesystem Abstraction. * Assumes that WP_Filesystem() has already been called and set up. Does not extract a root-level __MACOSX directory, if present. * * Attempts to increase the PHP Memory limit to 256M before uncompressing, * However, The most memory required shouldn't be much larger than the Archive itself. * * @since 2.5.0 * * @global WP_Filesystem_Base $wp_filesystem Subclass * * @param string $file Full path and filename of zip archive * @param string $to Full path on the filesystem to extract archive to * @return mixed WP_Error on failure, True on success */ function unzip_file($file, $to) { global $wp_filesystem; if ( ! $wp_filesystem || !is_object($wp_filesystem) ) return new WP_Error('fs_unavailable', __('Could not access filesystem.')); // Unzip can use a lot of memory, but not this much hopefully /** This filter is documented in wp-admin/admin.php */ @ini_set( 'memory_limit', apply_filters( 'admin_memory_limit', WP_MAX_MEMORY_LIMIT ) ); $needed_dirs = array(); $to = trailingslashit($to); // Determine any parent dir's needed (of the upgrade directory) if ( ! $wp_filesystem->is_dir($to) ) { //Only do parents if no children exist $path = preg_split('![/\\\]!', untrailingslashit($to)); for ( $i = count($path); $i >= 0; $i-- ) { if ( empty($path[$i]) ) continue; $dir = implode('/', array_slice($path, 0, $i+1) ); if ( preg_match('!^[a-z]:$!i', $dir) ) // Skip it if it looks like a Windows Drive letter. continue; if ( ! $wp_filesystem->is_dir($dir) ) $needed_dirs[] = $dir; else break; // A folder exists, therefor, we dont need the check the levels below this } } /** * Filter whether to use ZipArchive to unzip archives. * * @since 3.0.0 * * @param bool $ziparchive Whether to use ZipArchive. Default true. */ if ( class_exists( 'ZipArchive' ) && apply_filters( 'unzip_file_use_ziparchive', true ) ) { $result = _unzip_file_ziparchive($file, $to, $needed_dirs); if ( true === $result ) { return $result; } elseif ( is_wp_error($result) ) { if ( 'incompatible_archive' != $result->get_error_code() ) return $result; } } // Fall through to PclZip if ZipArchive is not available, or encountered an error opening the file. return _unzip_file_pclzip($file, $to, $needed_dirs); }
/** * Unzip's a specified ZIP file to a location * * @param string $file Full path of the zip file * @param string $to Full path where it is going to be unzipped * @return int */ function osc_unzip_file($file, $to) { if (!file_exists($to)) { if (!@mkdir($to, 0766)) { return 0; } } @chmod($to, 0777); if (!is_writable($to)) { return 0; } if (class_exists('ZipArchive')) { return _unzip_file_ziparchive($file, $to); } // if ZipArchive class doesn't exist, we use PclZip return _unzip_file_pclzip($file, $to); }