`
mengdejun
  • 浏览: 408263 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

php生成zip压缩文件

    博客分类:
  • Php
阅读更多
<?php
class PHPZip {
	function Zip($dir, $zipfilename) {
		if (@function_exists ( 'gzcompress' )) {
			$curdir = getcwd ();
			if (is_array ( $dir )) {
				$filelist = $dir;
			} else {
				$filelist = $this->GetFileList ( $dir );
			}
			
			if ((! empty ( $dir )) && (! is_array ( $dir )) && (file_exists ( $dir )))
				chdir ( $dir );
			else
				chdir ( $curdir );
			
			if (count ( $filelist ) > 0) {
				foreach ( $filelist as $filename ) {
					if (is_file ( $filename )) {
						$fd = fopen ( $filename, "r" );
						$content = fread ( $fd, filesize ( $filename ) );
						fclose ( $fd );
						
						if (is_array ( $dir ))
							$filename = basename ( $filename );
						$this->addFile ( $content, $filename );
					}
				}
				$out = $this->file ();
				
				chdir ( $curdir );
				$fp = fopen ( $zipfilename, "w" );
				fwrite ( $fp, $out, strlen ( $out ) );
				fclose ( $fp );
			}
			return 1;
		} else
			return 0;
	}
	
	function GetFileList($dir) {
		if (file_exists ( $dir )) {
			$args = func_get_args ();
			$pref = $args [1];
			
			$dh = opendir ( $dir );
			while ( $files = readdir ( $dh ) ) {
				if (($files != ".") && ($files != "..")) {
					if (is_dir ( $dir . $files )) {
						$curdir = getcwd ();
						chdir ( $dir . $files );
						$file = array_merge ( $file, $this->GetFileList ( "", "$pref$files/" ) );
						chdir ( $curdir );
					} else
						$file [] = $pref . $files;
				}
			}
			closedir ( $dh );
		}
		return $file;
	}
	
	var $datasec = array ();
	var $ctrl_dir = array ();
	var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";
	var $old_offset = 0;
	
	/**
	 * Converts an Unix timestamp to a four byte DOS date and time format (date
	 * in high two bytes, time in low two bytes allowing magnitude comparison).
	 *
	 * @param  integer  the current Unix timestamp
	 *
	 * @return integer  the current date in a four byte DOS format
	 *
	 * @access private
	 */
	function unix2DosTime($unixtime = 0) {
		$timearray = ($unixtime == 0) ? getdate () : getdate ( $unixtime );
		
		if ($timearray ['year'] < 1980) {
			$timearray ['year'] = 1980;
			$timearray ['mon'] = 1;
			$timearray ['mday'] = 1;
			$timearray ['hours'] = 0;
			$timearray ['minutes'] = 0;
			$timearray ['seconds'] = 0;
		} // end if
		

		return (($timearray ['year'] - 1980) << 25) | ($timearray ['mon'] << 21) | ($timearray ['mday'] << 16) | ($timearray ['hours'] << 11) | ($timearray ['minutes'] << 5) | ($timearray ['seconds'] >> 1);
	} // end of the 'unix2DosTime()' method
	

	/**
	 * Adds "file" to archive
	 *
	 * @param  string   file contents
	 * @param  string   name of the file in the archive (may contains the path)
	 * @param  integer  the current timestamp
	 *
	 * @access public
	 */
	function addFile($data, $name, $time = 0) {
		$name = str_replace ( '\\', '/', $name );
		
		$dtime = dechex ( $this->unix2DosTime ( $time ) );
		$hexdtime = '\x' . $dtime [6] . $dtime [7] . '\x' . $dtime [4] . $dtime [5] . '\x' . $dtime [2] . $dtime [3] . '\x' . $dtime [0] . $dtime [1];
		eval ( '$hexdtime = "' . $hexdtime . '";' );
		
		$fr = "\x50\x4b\x03\x04";
		$fr .= "\x14\x00"; // ver needed to extract
		$fr .= "\x00\x00"; // gen purpose bit flag
		$fr .= "\x08\x00"; // compression method
		$fr .= $hexdtime; // last mod time and date
		

		// "local file header" segment
		$unc_len = strlen ( $data );
		$crc = crc32 ( $data );
		$zdata = gzcompress ( $data );
		$c_len = strlen ( $zdata );
		$zdata = substr ( substr ( $zdata, 0, strlen ( $zdata ) - 4 ), 2 ); // fix crc bug
		$fr .= pack ( 'V', $crc ); // crc32
		$fr .= pack ( 'V', $c_len ); // compressed filesize
		$fr .= pack ( 'V', $unc_len ); // uncompressed filesize
		$fr .= pack ( 'v', strlen ( $name ) ); // length of filename
		$fr .= pack ( 'v', 0 ); // extra field length
		$fr .= $name;
		
		// "file data" segment
		$fr .= $zdata;
		
		// "data descriptor" segment (optional but necessary if archive is not
		// served as file)
		$fr .= pack ( 'V', $crc ); // crc32
		$fr .= pack ( 'V', $c_len ); // compressed filesize
		$fr .= pack ( 'V', $unc_len ); // uncompressed filesize
		

		// add this entry to array
		$this->datasec [] = $fr;
		$new_offset = strlen ( implode ( '', $this->datasec ) );
		
		// now add to central directory record
		$cdrec = "\x50\x4b\x01\x02";
		$cdrec .= "\x00\x00"; // version made by
		$cdrec .= "\x14\x00"; // version needed to extract
		$cdrec .= "\x00\x00"; // gen purpose bit flag
		$cdrec .= "\x08\x00"; // compression method
		$cdrec .= $hexdtime; // last mod time & date
		$cdrec .= pack ( 'V', $crc ); // crc32
		$cdrec .= pack ( 'V', $c_len ); // compressed filesize
		$cdrec .= pack ( 'V', $unc_len ); // uncompressed filesize
		$cdrec .= pack ( 'v', strlen ( $name ) ); // length of filename
		$cdrec .= pack ( 'v', 0 ); // extra field length
		$cdrec .= pack ( 'v', 0 ); // file comment length
		$cdrec .= pack ( 'v', 0 ); // disk number start
		$cdrec .= pack ( 'v', 0 ); // internal file attributes
		$cdrec .= pack ( 'V', 32 ); // external file attributes - 'archive' bit set
		

		$cdrec .= pack ( 'V', $this->old_offset ); // relative offset of local header
		$this->old_offset = $new_offset;
		
		$cdrec .= $name;
		
		// optional extra field, file comment goes here
		// save to central directory
		$this->ctrl_dir [] = $cdrec;
	} // end of the 'addFile()' method
	

	/**
	 * Dumps out file
	 *
	 * @return  string  the zipped file
	 *
	 * @access public
	 */
	function file() {
		$data = implode ( '', $this->datasec );
		$ctrldir = implode ( '', $this->ctrl_dir );
		
		return $data . $ctrldir . $this->eof_ctrl_dir . pack ( 'v', sizeof ( $this->ctrl_dir ) ) . // total # of entries "on this disk"
pack ( 'v', sizeof ( $this->ctrl_dir ) ) . // total # of entries overall
pack ( 'V', strlen ( $ctrldir ) ) . // size of central dir
pack ( 'V', strlen ( $data ) ) . // offset to start of central dir
"\x00\x00"; // .zip file comment length
	} // end of the 'file()' method


} // end of the 'PHPZip' class
?>

 

<?php
	require'PHPZip.php';
	$z = new PHPZip(); //新建立一个zip的类
	//$z->Zip("","z.zip");当前文件夹压缩
	$z->Zip(array("PHPZip.php"),"phpx.zip")
?>

 

分享到:
评论

相关推荐

    php生成zip压缩文件的方法详解

    接下来,我们将详细探讨PHP生成zip压缩文件的方法。 首先,我们需要了解在PHP中生成zip文件的基本原理。PHP支持通过多种方式生成zip文件,其中一种是利用内置的ZipArchive类,另一种是通过第三方库,比如PHPZip库。...

    PHP生成、下载excel、zip压缩文件_excelphp图片_excel_zip_php_

    接下来,我们来看如何使用PHP生成ZIP压缩文件。PHP内置了`ZipArchive`类,可以方便地进行文件和目录的压缩操作: 1. **创建ZipArchive实例**:`$zip = new ZipArchive();` 2. **打开或创建ZIP文件**:使用`open`...

    用PHP生成zip文件.

    在PHP中生成ZIP文件是一项常见的任务,特别是在处理网站文件打包、数据备份或文件分发时。`PHPZip`是一个PHP类,它提供了方便的方法来创建和管理ZIP档案。以下是对这个话题的详细解释: 首先,我们需要理解`PHPZip`...

    PHP生成压缩文,不带要压缩文件的根目录

    "PHP生成压缩文,不带要压缩文件的根目录"这个话题,主要涉及的是如何使用PHP的ZipArchive类来创建一个ZIP文件,但不包含源文件的根目录路径。下面将详细介绍这一知识点及其相关技术。 首先,我们需要了解PHP的Zip...

    php生成zip文件类.zip

    本资源“php生成zip文件类.zip”提供了一个PHP类库,它可以帮助开发者更方便地创建和管理ZIP文件。下面我们将深入探讨这个类库以及PHP操作ZIP文件的相关知识点。 1. **ZIP文件格式**: ZIP是一种通用的文件压缩...

    一个很实用的php zip压缩类库源码文件.zip

    本文将深入探讨“一个很实用的PHP ZIP压缩类库源码文件”,帮助开发者理解如何利用PHP处理ZIP文件,提升工作效率。 首先,我们要知道PHP内置了`ZipArchive`类,它是用于处理ZIP文件的主要工具。然而,为了简化操作...

    将文件进行zip压缩并base64加密和解密

    ZIP是一种流行的文件格式,用于将一个或多个文件打包成一个单一的压缩文件,以节省存储空间和提高传输效率。在Java中,我们可以使用`java.util.zip`包中的`ZipOutputStream`和`ZipEntry`类来实现文件的压缩。以下是...

    php在线压缩解压(phpZip) 1.1.zip

    又一款与PHP解压缩相匹配的打包(压缩)工具,其特点是可以在远程服务器上方便、快速的压缩文件,并且提供下载链接,方便下载,是网站备份的好工具。其他用途有待开发!(声明:此程序为开源程序,本人只是对其二次...

    PHPZip类实现php生成zip压缩包

    PHPZip类,生成zip格式的压缩包,可以直接在服务器上生成压缩包,也可以生成压缩并下载,也可以直接在线解压以及获得压缩包的相应信息

    PHP生成压缩文件开发实例

    1.生成压缩文件,压缩文件名格式: 2.压缩文件存放在根目录 /upload/zipfile/年月/自定义的压缩文件名.zip 3.点击下载压缩包,系统开始对压缩文件打包,打包完成后自动开始下载 4.为了防止暴露压缩包文件路径,...

    一个PHP的ZIP压缩类分享

    `addFile`方法是处理文件添加到压缩包的关键部分,它将读取到的文件内容和文件名传入,生成ZIP格式的数据块,并存入一个缓冲区中。 `GetFileList`方法则是遍历目录,递归地获取所有文件的相对路径,并将这些路径...

    PHP生成zip压缩包的常用方法示例

    本文实例讲述了PHP生成zip压缩包的常用方法。分享给大家供大家参考,具体如下: 压缩一个文件 我们将一个文件生成一个压缩包。 &lt;?php $path = c:/wamp/www/log.txt; $filename = test.zip; $zip = new Zip...

    php解压或压缩打包文件源码.zip

    本文将详细讨论如何使用PHP进行文件的解压和压缩打包,以及如何利用提供的"php解压或压缩打包文件源码.zip"进行相关操作。 首先,PHP提供了两个核心的库,用于处理文件的压缩和解压:`ZipArchive` 和 `gz` 函数系列...

    phpexcel.zip压缩文件

    在PHP开发中,处理Excel文件是一项常见的任务,无论是数据分析、报表生成还是用户交互,都需要高效且灵活的数据导入导出功能。PHPExcel库便是为此目的而生,它提供了强大的API,使得开发者能够轻松地读取、创建和...

    PHP实现解压缩zip文件并下载1

    在本文中,我们将深入探讨如何使用PHP实现解压缩zip文件以及下载功能。这个过程主要依赖于PHP自带的ZipArchive扩展库,它提供了对zip文件的操作支持。以下是实现这一功能的详细步骤: 首先,我们需要确保PHP环境中...

    基于PHP的在线解压压缩PHP脚本.zip

    ZipArchive类提供了创建、读取、修改和删除ZIP压缩文件的能力。 1. **创建和添加文件到ZIP** 要创建一个新的ZIP文件并添加文件,我们需要实例化一个ZipArchive对象,然后调用`open()`方法创建一个新文件或打开已...

    PHP在线打包在线压缩ZIP工具 v1.1.zip

    PHP在线打包在线压缩ZIP工具使用方法: 下载到本地之后,上传PHPZip.php文件到你的服务器上,对其进行访问。 默认密码:xibo123 修改密码方法:在地址栏访问你服务器上PHPZip.php文件,在其后面加上?pwd=密码代码...

    laravelexcelzip用于将一个大型Excel打包成Zip文件下载

    4. 压缩文件:在生成Excel文件后,调用`laravel-excel-zip`提供的方法将其压缩为ZIP。 5. 下载服务:最后,通过Laravel的路由和控制器提供一个下载链接,让用户可以下载ZIP文件。 从提供的压缩包文件名`cblink-...

Global site tag (gtag.js) - Google Analytics