当前位置 : 主页 > 网络编程 > PHP >

php压缩文件帮助类

来源:互联网 收集:自由互联 发布时间:2021-07-03
?php /* File name: /include/zip.php Author: Horace 2009/04/15 */ class PHPZip{ var $dirInfo = array("0","0"); var $rootDir = ''; var $datasec = array(); var $ctrl_dir = array(); var $eof_ctrl_dir = "/x50/x4b/x05/x06/x00/x00/x00/x00"; var $o
    <?php   
    /*  
    File name: /include/zip.php  
    Author: Horace 2009/04/15  
    */   
    class PHPZip{   
    var $dirInfo = array("0","0");   
    var $rootDir = '';   
    var $datasec = array();   
    var $ctrl_dir = array();   
    var $eof_ctrl_dir = "/x50/x4b/x05/x06/x00/x00/x00/x00";   
    var $old_offset = 0;   
    function downloadZip(){   
    createZip($dir, $zipfilename, true);   
    }   
    function createZip($dir, $zipfilename, $autoDownload = false){   
    if (@function_exists('gzcompress')){   
    @set_time_limit("0");   
    if (is_array($dir)){   
    $fd = fopen ($dir, "r");   
      
    $fileValue = fread ($fd, filesize ($filename));   
    fclose ($fd);   
    if (is_array($dir)) $filename = basename($dir);   
    $this -> addFile($fileValue, "$filename");   
    }else{   
    $this->dirTree($dir,$dir);   
    }   
    $zipfilenametemp = time().$zipfilename;   
    $out = $this -> filezip();   
    $fp = fopen($zipfilenametemp, "w");   
    fwrite($fp, $out, strlen($out));   
    fclose($fp);   
    $filesize = filesize($zipfilenametemp);   
    if ($filesize < 104857600) {   
    if($autoDownload){   
    header("Content-type: application/octet-stream");   
    header("Content-disposition: attachment; filename=".$zipfilename);   
    }   
    echo $this -> filezip();   
    }else{   
    echo "create zip error!";   
    }   
    unlink($zipfilenametemp);   
    }   
    }   
    //get dir tree..   
    function dirTree($directory,$rootDir){   
    global $_SERVER,$dirInfo,$rootDir;   
    $fileDir=$rootDir;   
    $myDir=dir($directory);   
    while($file=$myDir->read()){   
      
      
    if(is_dir("$directory/$file") and $file!="." and $file!=".."){   
    $dirInfo[0]++;   
    $rootDir ="$fileDir$file/";   
    $this -> addFile('', "$rootDir");   
    //go on n's folders   
    $this->dirTree("$directory/$file",$rootDir);   
    }else{   
    if($file!="." and $file!=".."){   
    $dirInfo[1]++;   
    //$fd = fopen ("$directory/$file", "r");   
    $fileValue = file_get_contents("$directory/$file");   
    //fclose ($fd);   
    $this -> addFile($fileValue, "$fileDir$file");   
    }   
    }   
    }   
    $myDir->close();   
    }   
    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);   
    }   
    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;   
    }   
    function filezip(){   
    $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   
    }   
    }   
    ?>   

 

还有另外一个比较简单的
 
[php] view plaincopy

    <?php    
      
    class createzip  
    {  
    /*  @creates a compressed zip file  将多个文件压缩成一个zip文件的函数  
    *   @$files 数组类型  实例array("1.jpg","2.jpg");    
    *   @destination  目标文件的路径  如"c:/androidyue.zip"  
    *   @$overwrite 是否为覆盖与目标文件相同的文件  
    *   @Recorded By Androidyue  
    *   @Blog:http://thinkblog.sinaapp.com  
     */    
    function create_zip($files = array(),$destination = '',$overwrite = false)   
    {    
        //如果zip文件已经存在并且设置为不重写返回false    
        if(file_exists($destination) && !$overwrite) { return false; }    
        $valid_files = array();    
        //if files were passed in...    
        //获取到真实有效的文件名    
        if(is_array($files)) {    
            //cycle through each file    
            foreach($files as $file) {    
            //make sure the file exists    
                if(file_exists($file)) {    
                $valid_files[] = $file;    
                }    
            }    
        }    
        //如果存在真实有效的文件    
        if(count($valid_files))   
        {    
            //create the archive    
            $zip = new ZipArchive();    
            //打开文件       如果文件已经存在则覆盖,如果没有则创建    
            if($zip->open($destination,$overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) {    
                return false;    
            }    
            //向压缩文件中添加文件    
            foreach($valid_files as $file) {    
                $zip->addFile($file,$file);    
            }    
            //关闭文件    
            $zip->close();    
            //检测文件是否存在    
            return file_exists($destination);    
        }  
        else{    
            //如果没有真实有效的文件返回false    
            return false;    
        }    
    }    
      
    }  
    /****   
    //测试函数  
    $files=array('temp.php','test.php');  
    create_zip($files, 'myzipfile.zip', true);  
    ****/    
    ?>    
网友评论