php文件在线压缩程序类
提供一款超完美的php文件在线压缩程序,原理很简单就是把文件以二进制形式保存了,以前用过利用rar的内核程序,这是php自带的压缩功能,实例代码如下:
set_time_limit(0); class phpzip{ var $file_count = 0 ; var $datastr_len = 0; var $dirstr_len = 0; var $filedata = '' ; //该变量只被类外部程序访问 var $gzfilename ; var $fp ; var $dirstr = '' ; /* 返回文件的修改时间格式. 只为本类内部函数调用. */ 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; } return (( $timearray [ 'year' ] - 1980) << 25) | ( $timearray [ 'mon' ] << 21) | ( $timearray [ 'mday' ] << 16) | ( $timearray [ 'hours' ] << 11) | ( $timearray [ 'minutes' ] << 5) | ( $timearray [ 'seconds' ] >> 1); } /* 初始化文件,建立文件目录, 并返回文件的写入权限. */ function startfile( $path = 'faisun.zip' ){ $this ->gzfilename= $path ; $mypathdir = array (); do { $mypathdir [] = $path = dirname( $path ); } while ( $path != '.' ); @ end ( $mypathdir ); do { $path = @current( $mypathdir ); @ mkdir ( $path ); } while (@prev( $mypathdir )); if ( $this ->fp=@ fopen ( $this ->gzfilename, "w" )){ return true; } return false; } /* 添加一个文件到 zip 压缩包中. */ function addfile( $data , $name ){ $name = str_replace ( '\', ' /', $name ); if ( strrchr ( $name , '/' )== '/' ) return $this ->adddir( $name ); $dtime = dechex ( $this ->unix2dostime()); $hexdtime = 'x' . $dtime [6] . $dtime [7] . 'x' . $dtime [4] . $dtime [5] . 'x' . $dtime [2] . $dtime [3] . 'x' . $dtime [0] . $dtime [1]; eval ( '$hexdtime = "' . $hexdtime . '";' ); $unc_len = strlen ( $data ); $crc = crc32( $data ); $zdata = gzcompress( $data ); $c_len = strlen ( $zdata ); $zdata = substr ( substr ( $zdata , 0, strlen ( $zdata ) - 4), 2); //新添文件内容格式化: $datastr = "PK" ; $datastr .= "" ; // ver needed to extract $datastr .= "" ; // gen purpose bit flag $datastr .= "" ; // compression method $datastr .= $hexdtime ; // last mod time and date $datastr .= pack( 'v' , $crc ); // crc32 $datastr .= pack( 'v' , $c_len ); // compressed filesize $datastr .= pack( 'v' , $unc_len ); // uncompressed filesize $datastr .= pack( 'v' , strlen ( $name )); // length of filename $datastr .= pack( 'v' , 0); // extra field length $datastr .= $name ; $datastr .= $zdata ; $datastr .= pack( 'v' , $crc ); // crc32 $datastr .= pack( 'v' , $c_len ); // compressed filesize $datastr .= pack( 'v' , $unc_len ); // uncompressed filesize fwrite( $this ->fp, $datastr ); //写入新的文件内容 $my_datastr_len = strlen ( $datastr ); unset( $datastr ); //新添文件目录信息 $dirstr = "PK" ; $dirstr .= "" ; // version made by $dirstr .= "" ; // version needed to extract $dirstr .= "" ; // gen purpose bit flag $dirstr .= "" ; // compression method $dirstr .= $hexdtime ; // last mod time & date $dirstr .= pack( 'v' , $crc ); // crc32 $dirstr .= pack( 'v' , $c_len ); // compressed filesize $dirstr .= pack( 'v' , $unc_len ); // uncompressed filesize $dirstr .= pack( 'v' , strlen ( $name ) ); // length of filename $dirstr .= pack( 'v' , 0 ); // extra field length $dirstr .= pack( 'v' , 0 ); // file comment length $dirstr .= pack( 'v' , 0 ); // disk number start $dirstr .= pack( 'v' , 0 ); // internal file attributes $dirstr .= pack( 'v' , 32 ); // external file attributes - 'archive' bit set $dirstr .= pack( 'v' , $this ->datastr_len ); // relative offset of local header $dirstr .= $name ; $this ->dirstr .= $dirstr ; //目录信息 $this -> file_count ++; $this -> dirstr_len += strlen ( $dirstr ); $this -> datastr_len += $my_datastr_len ; } function adddir( $name ){ $name = str_replace ( "\", " /", $name ); $datastr = "PK " ; $datastr .= pack( "v" ,0).pack( "v" ,0).pack( "v" ,0).pack( "v" , strlen ( $name ) ); $datastr .= pack( "v" , 0 ). $name .pack( "v" , 0).pack( "v" , 0).pack( "v" , 0); fwrite( $this ->fp, $datastr ); //写入新的文件内容 $my_datastr_len = strlen ( $datastr ); unset( $datastr ); $dirstr = "PK " ; $dirstr .= pack( "v" ,0).pack( "v" ,0).pack( "v" ,0).pack( "v" , strlen ( $name ) ); $dirstr .= pack( "v" , 0 ).pack( "v" , 0 ).pack( "v" , 0 ).pack( "v" , 0 ); $dirstr .= pack( "v" , 16 ).pack( "v" , $this ->datastr_len). $name ; $this ->dirstr .= $dirstr ; //目录信息 $this -> file_count ++; $this -> dirstr_len += strlen ( $dirstr ); $this -> datastr_len += $my_datastr_len ; } //开源代码phpfensi测试数据 function createfile(){ //压缩包结束信息,包括文件总数,目录信息读取指针位置等信息 $endstr = "PK" . pack( 'v' , $this -> file_count) . pack( 'v' , $this -> file_count) . pack( 'v' , $this -> dirstr_len) . pack( 'v' , $this -> datastr_len) . "" ; fwrite( $this ->fp, $this ->dirstr. $endstr ); fclose( $this ->fp); } }查看更多关于php文件在线压缩程序类 - php类库的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did29522