📄 zip.php
字号:
<?php
/**
* @version $Id:zip.php 6961 2007-03-15 16:06:53Z tcp $
* @package Joomla.Framework
* @subpackage FileSystem
* @copyright Copyright (C) 2005 - 2007 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 framework
defined('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>
*
* @author Louis Landry <louis.landry@joomla.org>
* @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 ($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);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -