首页 > php框架 > php实现文件在线压缩功能

php实现文件在线压缩功能


<?php

class ZipAllFloder
{
    var 
$cachelist 
= array();
    var 
$datasec      
= array();  
    var 
$ctrl_dir     
= array();  
    var 
$eof_ctrl_dir "x50x4bx05x06x00x00x00x00"
;  
    var 
$old_offset   0
;  
    
    function 
StartWork($dir
){
        
$result $this->GetList($dir
);
        
$this->ClearCache
();
        return 
$result
;
    } 
    function 
ReadAndExport($filelist,$zipfilename
){  
        if (
count($filelist)>0
){  
            foreach(
$filelist as $filename
){  
                if (
is_file($filename
)){  
                    
$fp fopen ($filename"r"
);  
                    
$content = @fread ($fp,filesize($filename
));  
                    
fclose ($fp
);  
                    
$filename basename($filename
);  
                    
$this -> addFile($content$filename
);  
                }  
            }  
        }else{
            
$this -> addFile("This folder have none a single file!","nofile.log"
);
        }
        
$out $this -> outfile
(); 
        
$this -> IniVars
();
        
$fp fopen($zipfilename,"w"
);  
        
fwrite($fp,$out,strlen($out
));  
        
fclose($fp
);
        
$this -> cachelist[] = $zipfilename

    }
    function 
GetList($dir
){  
        if (
file_exists($dir
)){  
            
$handle opendir($dir
); 
            while(
$files readdir($handle
)){  
                if ((
$files==".")||($files==".."
)) continue; 
                if(
is_dir($dir."/".$files
)){
                    
$this -> GetList($dir."/".$files
);
                }else{
                    
$filelist[] = $dir."/".$files

                } 
            }  
            
closedir($handle
);
            
$zipfilename dirname($dir)."/[FOLDER]".basename($dir).".zip"
;
            
$this -> ReadAndExport($filelist,$zipfilename
);
        }  
        return 
$zipfilename
;  
    }  
    function 
ClearCache
(){
        if(
$num count($this ->cachelist
)){
            for(
$i=0;$i<$num-1;$i
++){
                @
unlink($this ->cachelist[$i
]);
            }
        }
    }
    function 
IniVars
(){
        
$this -> datasec 
= array();
        
$this -> ctrl_dir 
= array();
        
$this -> eof_ctrl_dir "x50x4bx05x06x00x00x00x00"
;
        
$this -> old_offset   0
;
    }
    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 
addFile($data$name$time 0
){  
        
$name str_replace(/$name
);  
        
$dtime dechex($this->unix2DosTime($time
));  
        
$hexdtime $dtime[6] . $dtime[7
]  
                  . 
$dtime[4] . $dtime[5
]  
                  . 
$dtime[2] . $dtime[3
]  
                  . 
$dtime[0] . $dtime[1
];  
        eval(
$hexdtime = " $hexdtime ";
);  
        
$fr   "x50x4bx03x04"
;  
        
$fr   .= "x14x00"
;
        
$fr   .= "x00x00"
;
        
$fr   .= "x08x00"
;
        
$fr   .= $hexdtime

        
$unc_len strlen($data
);  
        
$crc     crc32($data
);  
        
$zdata   gzcompress($data
);  
        
$c_len   strlen($zdata
);  
        
$zdata   substr(substr($zdata0strlen($zdata) - 4), 2
);
        
$fr      .= pack(V$crc
);
        
$fr      .= pack(V$c_len
);
        
$fr      .= pack(V$unc_len
);
        
$fr      .= pack(vstrlen($name
));
        
$fr      .= pack(v0
);
        
$fr      .= $name
;  
        
$fr .= $zdata
;  
        
$fr .= pack(V$crc
);
        
$fr .= pack(V$c_len
);
        
$fr .= pack(V$unc_len
);
        
$this -> datasec[] = $fr
;  
        
$new_offset        strlen(implode($this->datasec
));  
        
$cdrec "x50x4bx01x02"
;  
        
$cdrec .= "x00x00"
;
        
$cdrec .= "x14x00"
;
        
$cdrec .= "x00x00"
;
        
$cdrec .= "x08x00"
;
        
$cdrec .= $hexdtime
;
        
$cdrec .= pack(V$crc
);
        
$cdrec .= pack(V$c_len
);
        
$cdrec .= pack(V$unc_len
);
        
$cdrec .= pack(vstrlen($name
) );
        
$cdrec .= pack(v
);
        
$cdrec .= pack(v
);
        
$cdrec .= pack(v
);
        
$cdrec .= pack(v
);
        
$cdrec .= pack(V32 
);
        
$cdrec .= pack(V$this -> old_offset 
);
        
$this -> old_offset $new_offset
;  
        
$cdrec .= $name
;  
        
$this -> ctrl_dir[] = $cdrec
;  
    }
    function 
outfile
(){  
        
$data    implode($this -> datasec
);  
        
$ctrldir implode($this -> ctrl_dir
);  
        return  
            
$data 
.  
            
$ctrldir 
.  
            
$this -> eof_ctrl_dir 
.  
            
pack(vsizeof($this -> ctrl_dir
)) .
            
pack(vsizeof($this -> ctrl_dir
)) .
            
pack(Vstrlen($ctrldir
)) .
            
pack(Vstrlen($data
)) .
            
"x00x00"
;
    }
}

$zip = new ZipAllFloder
();
$str $zip->StartWork("./baby"
);
echo 
$str
;
?>


本文地址:http://www.phprm.com/frame/php1004891.html

转载随意,但请附上文章地址:-)

标签:none

发表留言