zoukankan      html  css  js  c++  java
  • php压缩文件帮助类

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


     

  • 相关阅读:
    BZOJ 2120 数颜色
    BZOJ 3289 Mato的文件管理
    BZOJ 2038 小Z的袜子
    BZOJ 1878 HH的项链
    洛谷P2709 小B的询问
    6491: Daydream
    问题 L: An Invisible Hand
    HDU-2177 取(2堆)石子游戏 (威佐夫博奕)
    (POJ-3279)Fliptile (dfs经典---也可以枚举)
    问题 J: Palindromic Password ( 2018组队训练赛第十五场) (简单模拟)
  • 原文地址:https://www.cnblogs.com/zhujunxxxxx/p/3344860.html
Copyright © 2011-2022 走看看