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.com
- 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);
- }
- }