首頁 > 後端開發 > php教程 > php 打包網站線上壓縮為zip

php 打包網站線上壓縮為zip

WBOY
發布: 2016-07-23 08:54:51
原創
865 人瀏覽過
    1. ?//URL後參加?pwd=密碼查看產生密碼
    2. $password = '8baa717e6265d1c1d762cc896151f821'
    3. php ZIP 壓縮程式
    4. 線上壓縮ZIP檔程式


    5. 使用方法:選定要壓縮的檔案或目錄(包含子目錄),即可開始壓縮。壓縮的結果保留原來的目錄結構。

    6. echo '当前目录:'. dirname(__FILE__) . ' 退出';
    7. else
    8. if(isset($_GET['pwd']) )
    9. echo '密码值:'. md5($_GET['pwd']) . '';
    10. else
    11. echo 'Tips:在URL后参加?pwd=密码 查看生成密码.';
    12. ?>
  • if(!isset($_REQUEST["myaction"])):
  • ?>
  • 驗證密碼:
  • ;
  • elseif($_REQUEST[" myaction"]=="dolist"):
  • if(!isset( $_REQUEST['pwd']) || empty($_REQUEST['pwd']) )
  • die('請輸入密碼! ');
  • if(md5($_REQUEST['pwd']) != $password)
  • die('輸入的密碼不正確!Again');
  • echo '選擇要排除的目錄(相對路徑,以英文半角逗號分隔):
    ';
  • echo '
    ';
  • echo "選擇要壓縮的檔案或目錄:
    ";
  • $fdir = opendir('./');
  • while($file=readdir($fdir)){
  • if($file=='.'|| $file=='..' ) continue;
  • echo " ";
  • if(is_file($file)){
  • echo "檔: $file
    ";
  • }else{
  • echo "目錄: $file
    ";
  • }
  • }
  • ?>

  • 壓縮檔案儲存到目錄:
  • (留空為本目錄,必須有寫入權限)
  • 壓縮檔案名稱:
  • (.zip)

  • elseif($_REQUEST["myaction"]=="dozip"):
  • // set_time_limit(0 );
  • class PHPzip{
  • var $file_count = 0 ;
  • var $datastr_len = 0;
  • var $dirstr_len = 0;
  • var $data = '' ; //變數只被類別外部程式存取
  • var $gzfilename;
  • var $fp;
  • var $dirstr='';
  • /*
  • 傳回檔案的修改時間格式.
  • 只為本類內部函數呼叫.
  • */
  • function unix2DosTime($unixtime = 0) {
  • $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime );
  • if ($timearray['year'] $timearray['year'] = 1980;
  • $timearray['mon'] = 1;
  • $timearray['mday'] = 1;
  • $timearray['hours'] = 0;
  • $timearray['minutes'] = 0;
  • $timearray['seconds'] = 0;
  • }
  • return (($timearray['year'] - 1980) ($timearray['hours'] > 1);
  • }
  • /*
  • 初始化檔案,建立檔案目錄,
  • 並傳回檔案的寫入權限.
  • */
  • function startfile($path = 'myzip.zip'){
  • $this->gzfilename=$path;
  • $mypathdir=array();
  • do{
  • $mypathdir[] = $path = dirname($path);
  • }while($ path != '.');
  • @end($mypathdir);
  • do{
  • $path = @current($mypathdir);
  • @mkdir($path);
  • } while(@prev($mypathdir));
  • if($this->fp=@fopen($this->gzfilename,"w")){
  • return true;
  • }
  • return false; }
  • /*
  • 新增一個檔案到zip 壓縮包中.
  • */
  • function addfile($data, $name){
  • $name = str_replace('\', '/', $name);
  • if(strrchr($name,'/')=='/') return $this->adddir($name);
  • $dtime = dechex($this->unix2DosTime());
  • $hexdtime = 'x' . $dtime[6] . $dtime[7]
  • . 'x' . $dtime[4] . $dtime[ 5]
  • . 'x' . $dtime[2] . $dtime[3]
  • . 'x' . $dtime[0] . $dtime[1];
  • eval('$hexdtime = "' . $hexdtime . '";');
  • $unc_len = strlen($data);
  • $crc = crc32($data);
  • $zdata = gzcompress($data) ;
  • $c_len = strlen($zdata);
  • $zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2);
  • //新添檔案內容格式化:
  • $datastr = "x50x4bx03x04";
  • $datastr .= "x14x00"; // ver needed to extract
  • $datastr .= "x00x00"; 🎜> $datastr .= "x08x00"; // compression method
  • $datastr .= $hexdtime; // last mod time and date
  • $datastr .= pack('V', $crc); // crc32
  • $datastr .= pack('V', $c_len); // compressed filesize
  • $datastr .= pack('V', $unc_len); // uncompressed filesize
  • $datastr .= pack('v', strlen($name)); // length of filename
  • $datastr .= pack('v', 0); // extra field length
  • $datastr .= $name;
  • $datastr .= $zdata;
  • $datastr .= pack('V', $crc); // crc32
  • $datastr .= pack('V', $c_len); // compressed filesize
  • $datastr .= pack('V', $unc_len); // uncompressed filesize
  • fwrite($this->fp,$datastr); //寫入新的檔案內容
  • $my_datastr_len = strlen($datastr);
  • unset($datastr);
  • //新增加檔案目錄資訊
  • $dirstr = "x50x4bx01x02";
  • $dirstr = "x50x4bx01x02";
  • $dirstr = "x00x00"; // version made by
  • $dirstr .= "x14x00"; // version needed to extract
  • $dirstr .= "x00x00"; // gen purpose bit flag $dirstr .= $hexdtime; // last mod time & date
  • $dirstr .= pack('V', $crc); // crc32
  • $ dirstr .= pack('V', $c_len); // compressed filesize
  • $dirstr .= pack('V', $unc_len); // uncompressed filesize
  • $dirstr .= pack('v' , strlen($name) ); // length of filename
  • $dirstr .= pack('v', 0 ); // extra field length
  • $dirstr .= pack('v', 0 ); // file comment length
  • $dirstr .= pack('v', 0 ); // disk number start
  • $dirstr .= pack('v', 0 ); // internal file attributes
  • $dirstr .= pack('V', 32 ); // external file attributes - 'archive' bit set
  • $dirstr .= pack('V',$this->datastr_len ); // relative offset of local header
  • $dirstr .= $name;
  • $this->dirstr .= $dirstr; //目錄資訊
  • $this -> file_count ;
  • $this -> dirstr_len = strlen($dirstr);
  • $this -> datastr_len = $my_datastr_len;
  • }
  • function adddir($name){
  • $name = str_replace("\", "🎜> $name = str_replace("\", "🎜> $name = str_replace("\", "🎜> $name = str_replace("\", "🎜> $name = str_replace("\", "🎜> $name = str_replace("\", "🎜> $name = str_replace("\", "🎜> $name = str_replace("\"、 /", $name);
  • $datastr = "x50x4bx03x04x0ax00x00x00x00x00x00x00x00x00";
  • $datastr .= pack(pack"V",0)。 ,0).pack("v", strlen($name) );
  • $datastr .= pack("v", 0 ).$name.pack("V", 0).pack("V" , 0).pack("V", 0);
  • fwrite($this->fp,$datastr); //寫入新的檔案內容
  • $my_datastr_len = strlen($datastr) ;
  • unset($datastr);
  • $dirstr = "x50x4bx01x02x00x00x0ax00x00x00x00x00x00x00x00x00"; $dirstr .= pack("v", 0 ).pack("v", 0 ).pack("v" , 0 ).pack("v", 0 );
  • $dirstr .= pack("V", 16 ).pack("V",$this->datastr_len).$name;
  • $this->dirstr .= $dirstr; //目錄資訊
  • $this -> file_count ;
  • $this -> dirstr_len = strlen($dirstr);
  • $this -> datastr_len = $my_datastr_len;
  • }
  • function createfile(){
  • //壓縮封包結束資訊,包含檔案總數,目錄資訊讀取指標位置等資訊
  • $endstr = "x50x4bx05x06x00x00x000x00" . file_count) .
  • pack('v', $this -> file_count) .
  • pack('V', $this -> dirstr_len) .
  • pack(' V', $this -> datastr_len) .
  • "x00x00";
  • fwrite($this->fp,$this->dirstr.$endstr);
  • fclose($this-> fp);
  • }
  • }
  • if(!trim($_REQUEST['zipname']))
  • $_REQUEST['zipname'] = 'backup_'.substr (md5(__FILE__),0,8). '.zip';
  • else
  • $_REQUEST['zipname'] = trim($_REQUEST['zipname']);
  • if(!strrchr( strtolower($_REQUEST['zipname']),'.')=='.zip')
  • $_REQUEST['zipname'] .= ".zip";
  • $_REQUEST['todir'] = str_replace('\','/',trim($_REQUEST['todir']));
  • if(!strrchr(strtolower($_REQUEST['todir']),'/')=='/' )
  • $_REQUEST['todir'] .= "/";
  • if($_REQUEST['todir']=="/")
  • $_REQUEST['todir'] = "./" ;
  • function listfiles($dir="."){
  • global $faisunZIP;
  • $sub_file_num = 0;
  • if(is_file($dir)){
  • if(is_file($dir)){
  • if(realpath($faisunZIP->gzfilename)!=realpath($dir)){
  • $faisunZIP -> addfile(implode('',file($dir)),$dir);
  • return 1 ;
  • }
  • return 0;
  • }
  • $handle=opendir($dir);
  • //新增排除
  • $to_exlude = !empty($_POST[' toexlude']) ? $_POST['toexlude'] :'';
  • $exlude = empty($to_exlude) ? array() : explode(',',$to_exlude);
  • while ($file = readdir($handle)) {
  • if($file=="."||$file==".." || $file == 'wp-content' )continue;
  • if(is_dir( "$dir/$file") && !in_array("$dir/$file",$exlude) )
  • {
  • $sub_file_num = listfiles("$dir/$file");
  • }
  • else {
  • if(realpath($faisunZIP ->gzfilename)!=realpath("$dir/$file")){
  • $faisunZIP -> addfile(implode('',file("$dir /$file")),"$dir/$file");
  • $sub_file_num ;
  • }
  • }
  • }
  • closedir($handle);
  • if(!$ sub_file_num) $faisunZIP -> addfile("","$dir/");
  • return $sub_file_num;
  • }
  • function num_bitunit($num){
  • $bitunit=array( ' B',' KB',' MB',' GB');
  • for($key=0;$key if($num>=pow (2,10*$key)-1){ //1023B 會顯示為1KB
  • $num_bitunit_str=(ceil($num/pow(2,10*$key)*100)/100)." $bitunit [$key]";
  • }
  • }
  • return $num_bitunit_str;
  • }
  • if(is_array($_REQUEST['dfile'])){
  • $faisunZ = new PHPzip;
  • if($faisunZIP -> startfile($_REQUEST['todir'].$_REQUEST['zipname'])){
  • echo "正在新增壓縮檔案...

    ";
  • $filenum = 0;
  • foreach($_REQUEST['dfile'] as $file){
  • if(is_file($file)){
  • echo "檔: $file
    ";
  • }else{
  • echo "目錄: $file
    ";
  • }
  • $filenum = listfiles( $file);
  • }
  • $faisunZIP -> createfile();
  • echo "
    壓縮完成,共添加$filenum 個檔案.
    ". $_REQUEST['todir'].$_REQUEST['zipname']." (".num_bitunit(filesize("$_REQUEST[todir]$ _REQUEST[zipname]")).")";
  • }else{
  • echo $_REQUEST['todir'].$_REQUEST['zipname'].'不能寫入,請檢查路徑或權限是否正確.
    ';
  • }
  • }else{
  • echo "沒有選擇的檔案或目錄.
    ";
  • }
  • endif;
  • ?>
  • TOP

  • 複製程式碼


    php、zip


  • 來源:php.cn
    本網站聲明
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
    熱門推薦
    熱門教學
    更多>
    最新下載
    更多>
    網站特效
    網站源碼
    網站素材
    前端模板