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



 

分类:

技术点:

相关文章:

  • 2021-11-21
  • 2021-11-22
  • 2022-01-15
  • 2021-11-15
  • 2022-01-12
  • 2022-01-23
  • 2022-02-10
  • 2021-06-10
猜你喜欢
  • 2021-12-23
  • 2021-07-15
  • 2021-12-06
  • 2021-10-13
  • 2022-12-23
  • 2021-11-28
相关资源
相似解决方案