PHP ZIP压缩类代码
本程序可以快速的实现把我们的文件利用php压缩类压缩成我们想的zip,或者rar 的压缩包,后缀名可以自定义,压缩算法是来自国外一个网站抄的.
首先实例化,然后传参,两个参数,第一个关于你文件地址的一个Array,第二个是要你要保存的压缩包文件的绝对地址.
For example,代码如下:
$zipfiles = array ( "/root/pooy/test1.txt" , "/root/pooy/test2.txt" ); $z = new PHPZip(); //$randomstr = random(8); $zipfile = TEMP. "/photocome_" . $groupid . ".zip" ; $z ->Zip( $zipfiles , $zipfile );添加文件列表PHP的ZIP压缩类如下,代码如下:
<?php # # PHPZip v1.2 by Sext (sext@neud.net) 2002-11-18 # (Changed: 2003-03-01) # # Makes zip archive # # Based on "Zip file creation class" , uses zLib # # 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 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 = "x50x4bx05x06x00x00x00x00" ; 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 = "x50x4bx03x04" ; $fr .= "x14x00" ; // ver needed to extract $fr .= "x00x00" ; // gen purpose bit flag $fr .= "x08x00" ; // 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 = "x50x4bx01x02" ; $cdrec .= "x00x00" ; // version made by $cdrec .= "x14x00" ; // version needed to extract $cdrec .= "x00x00" ; // gen purpose bit flag $cdrec .= "x08x00" ; // 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"//开源代码phpfensi测试数据 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 "x00x00" ; // .zip file comment length } // end of the 'file()' method } // end of the 'PHPZip' class ?>查看更多关于PHP ZIP压缩类代码 - php类库的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did29529