php压缩文件帮助类

开发技术 作者: 2024-07-27 21:55:01
php压缩文件帮助类

下面是编程之家 jb51.cc 通过网络收集整理的代码片段。

编程之家小编现在分享给大家,也给大家做个参考。

    <?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,$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,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',$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);  
    ****/    
    ?>    

以上是编程之家(jb51.cc)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

原创声明
本站部分文章基于互联网的整理,我们会把真正“有用/优质”的文章整理提供给各位开发者。本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
本文链接:http://www.jiecseo.com/news/show_51913.html
php压缩文件帮助类