📄 zip.php
字号:
<?php/** * @version $Id:zip.php 6961 2007-03-15 16:06:53Z tcp $ * @package Joomla.Framework * @subpackage FileSystem * @copyright Copyright (C) 2005 - 2008 Open Source Matters. All rights reserved. * @license GNU/GPL, see LICENSE.php * Joomla! is free software. This version may have been modified pursuant * to the GNU General Public License, and as distributed it includes or * is derivative of works licensed under the GNU General Public License or * other free or open source software licenses. * See COPYRIGHT.php for copyright notices and details. */// Check to ensure this file is within the rest of the frameworkdefined('JPATH_BASE') or die();/** * ZIP format adapter for the JArchive class * * The ZIP compression code is partially based on code from: * Eric Mueller <eric@themepark.com> * http://www.zend.com/codex.php?id=535&single=1 * * Deins125 <webmaster@atlant.ru> * http://www.zend.com/codex.php?id=470&single=1 * * The ZIP compression date code is partially based on code from * Peter Listiak <mlady@users.sourceforge.net> * * This class is inspired from and draws heavily in code and concept from the Compress package of * The Horde Project <http://www.horde.org> * * @contributor Chuck Hagenbuch <chuck@horde.org> * @contributor Michael Slusarz <slusarz@horde.org> * @contributor Michael Cochrane <mike@graftonhall.co.nz> * * @package Joomla.Framework * @subpackage FileSystem * @since 1.5 */class JArchiveZip extends JObject{ /** * ZIP compression methods. * @var array */ var $_methods = array ( 0x0 => 'None', 0x1 => 'Shrunk', 0x2 => 'Super Fast', 0x3 => 'Fast', 0x4 => 'Normal', 0x5 => 'Maximum', 0x6 => 'Imploded', 0x8 => 'Deflated' ); /** * Beginning of central directory record. * @var string */ var $_ctrlDirHeader = "\x50\x4b\x01\x02"; /** * End of central directory record. * @var string */ var $_ctrlDirEnd = "\x50\x4b\x05\x06\x00\x00\x00\x00"; /** * Beginning of file contents. * @var string */ var $_fileHeader = "\x50\x4b\x03\x04"; /** * ZIP file data buffer * @var string */ var $_data = null; /** * ZIP file metadata array * @var array */ var $_metadata = null; /** * Create a ZIP compressed file from an array of file data. * * @todo Finish Implementation * * @access public * @param string $archive Path to save archive * @param array $files Array of files to add to archive * @param array $options Compression options [unused] * @return boolean True if successful * @since 1.5 */ function create($archive, $files, $options = array ()) { // Initialize variables $contents = array(); $ctrldir = array(); foreach ($files as $file) { $this->_addToZIPFile($file, $contents, $ctrldir); } return $this->_createZIPFile($contents, $ctrldir, $archive); } /** * Extract a ZIP compressed file to a given path * * @access public * @param string $archive Path to ZIP archive to extract * @param string $destination Path to extract archive into * @param array $options Extraction options [unused] * @return boolean True if successful * @since 1.5 */ function extract($archive, $destination, $options = array ()) { if ( ! is_file($archive) ) { $this->set('error.message', 'Archive does not exist'); return false; } if ($this->hasNativeSupport()) { return ($this->_extractNative($archive, $destination, $options))? true : JError::raiseWarning(100, $this->get('error.message')); } else { return ($this->_extract($archive, $destination, $options))? true : JError::raiseWarning(100, $this->get('error.message')); } } /** * Method to determine if the server has native zip support for faster handling * * @access public * @return boolean True if php has native ZIP support * @since 1.5 */ function hasNativeSupport() { return (function_exists('zip_open') && function_exists('zip_read')); } /** * Checks to see if the data is a valid ZIP file. * * @access public * @param string $data ZIP archive data buffer * @return boolean True if valid, false if invalid. * @since 1.5 */ function checkZipData(& $data) { if (strpos($data, $this->_fileHeader) === false) { return false; } else { return true; } } /** * Extract a ZIP compressed file to a given path using a php based algorithm that only requires zlib support * * @access private * @param string $archive Path to ZIP archive to extract * @param string $destination Path to extract archive into * @param array $options Extraction options [unused] * @return boolean True if successful * @since 1.5 */ function _extract($archive, $destination, $options) { // Initialize variables $this->_data = null; $this->_metadata = null; if (!extension_loaded('zlib')) { $this->set('error.message', 'Zlib Not Supported'); return false; } if (!$this->_data = JFile::read($archive)) { $this->set('error.message', 'Unable to read archive'); return false; } if (!$this->_getZipInfo($this->_data)) { return false; } for ($i=0,$n=count($this->_metadata);$i<$n;$i++) { if (substr($this->_metadata[$i]['name'], -1, 1) != '/' && substr($this->_metadata[$i]['name'], -1, 1) != '\\') { $buffer = $this->_getFileData($i); $path = JPath::clean($destination.DS.$this->_metadata[$i]['name']); // Make sure the destination folder exists if (!JFolder::create(dirname($path))) { $this->set('error.message', 'Unable to create destination'); return false; } if (JFile::write($path, $buffer) === false) { $this->set('error.message', 'Unable to write entry'); return false; } } } return true; } /** * Extract a ZIP compressed file to a given path using native php api calls for speed * * @access private * @param string $archive Path to ZIP archive to extract * @param string $destination Path to extract archive into * @param array $options Extraction options [unused] * @return boolean True if successful * @since 1.5 */ function _extractNative($archive, $destination, $options) { if ($zip = zip_open($archive)) { if (is_resource($zip)) { // Make sure the destination folder exists if (!JFolder::create($destination)) { $this->set('error.message', 'Unable to create destination'); return false; } // Read files in the archive while ($file = @zip_read($zip)) { if (zip_entry_open($zip, $file, "r")) { if (substr(zip_entry_name($file), strlen(zip_entry_name($file)) - 1) != "/") { $buffer = zip_entry_read($file, zip_entry_filesize($file)); if (JFile::write($destination.DS.zip_entry_name($file), $buffer) === false) { $this->set('error.message', 'Unable to write entry'); return false; } zip_entry_close($file); } } else { $this->set('error.message', 'Unable to read entry'); return false; } } @zip_close($zip); } } else { $this->set('error.message', 'Unable to open archive'); return false; } return true; } /**
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -