程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 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 = 'x' . $dtime[6] . $dtime[7
]  
                  . 'x' . $dtime[4] . $dtime[5
]  
                  . 'x' . $dtime[2] . $dtime[3
]  
                  . 'x' . $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($zdata, 0, strlen($zdata) - 4), 2
);
        $fr      .= pack('V', $crc
);
        $fr      .= pack('V', $c_len
);
        $fr      .= pack('V', $unc_len
);
        $fr      .= pack('v', strlen($name
));
        $fr      .= pack('v', 0
);
        $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('v', strlen($name
) );
        $cdrec .= pack('v', 0 
);
        $cdrec .= pack('v', 0 
);
        $cdrec .= pack('v', 0 
);
        $cdrec .= pack('v', 0 
);
        $cdrec .= pack('V', 32 
);
        $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('v', sizeof($this -> ctrl_dir
)) .
            pack('v', sizeof($this -> ctrl_dir
)) .
            pack('V', strlen($ctrldir
)) .
            pack('V', strlen($data
)) .
            "x00x00"
;
    }
}

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


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved