php文件在线压缩程序类

作者:袖梨 2022-06-24
 代码如下 复制代码

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

?>

相关文章

精彩推荐