找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 324|回复: 0
打印 上一主题 下一主题

php打包网站并在线压缩为zip

[复制链接]

2617

主题

2617

帖子

7789

积分

论坛元老

Rank: 8Rank: 8

积分
7789
跳转到指定楼层
楼主
发表于 2018-2-14 05:39:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

            本文实例介绍了php打包网站并在线压缩为zip的方法,分享给大家供大家参考,具体内容如下

  
php ZIP压缩程序


">
在线压缩ZIP文件程序

   使用方法:选定要压缩的文件或目录(包含子目录),即可开始压缩。压缩的结果保留原来的目录结构。
   '. dirname(__FILE__) . '        [url=]退出[/url]';
     else
      if(isset($_GET['pwd']) )
        echo '密码值:'. md5($_GET['pwd']) . '';
      else
        echo 'Tips:在URL后参加?pwd=密码 查看生成密码.';
    ?>
   
验证密码:


文件: $file
";
    }else{
      echo "目录: $file
";
    }
  }
?>
压缩文件保存到目录:
_" size="20">
(留空为本目录,必须有写入权限)
压缩文件名称:
.zip" size="15">
(.zip)
">



> 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 = "\x50\x4b\x03\x04";
    $datastr .= "\x14\x00";      // ver needed to extract
    $datastr .= "\x00\x00";      // gen purpose bit flag
    $datastr .= "\x08\x00";      // 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 = "\x50\x4b\x01\x02";
    $dirstr .= "\x00\x00";          // version made by
    $dirstr .= "\x14\x00";          // version needed to extract
    $dirstr .= "\x00\x00";          // gen purpose bit flag
    $dirstr .= "\x08\x00";          // compression method
    $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);
    $datastr = "\x50\x4b\x03\x04\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00";

    $datastr .= pack("V",0).pack("V",0).pack("V",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 = "\x50\x4b\x01\x02\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00";
    $dirstr .= pack("V",0).pack("V",0).pack("V",0).pack("v", strlen($name) );
    $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 = "\x50\x4b\x05\x06\x00\x00\x00\x00" .
          pack('v', $this -> file_count) .
          pack('v', $this -> file_count) .
          pack('V', $this -> dirstr_len) .
          pack('V', $this -> datastr_len) .
          "\x00\x00";

    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(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=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'])){
    $faisunZIP = 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 个文件.
[url=" .$_REQUEST[]". $_REQUEST['todir'].$_REQUEST['zipname']." (".num_bitunit(filesize("$_REQUEST[todir]$_REQUEST[zipname]")).")[/url]";
    }else{
      echo $_REQUEST['todir'].$_REQUEST['zipname'].'不能写入,请检查路径或权限是否正确.
';
    }
  }else{
    echo "没有选择的文件或目录.
";
  }


endif;

?>


  TOP


以上就是本文的全部内容,希望对大家的学习有所帮助。
            
            
您可能感兴趣的文章:
  • php实现zip压缩文件解压缩代码分享(简单易懂)
  • php实现的zip文件内容比较类
  • php在线解压ZIP文件的方法
  • php操作(删除,提取,增加)zip文件方法详解
  • php生成zip文件类实例
  • php实现zip文件解压操作
  • php简单创建zip压缩文件的方法
  • php打包压缩文件之ZipArchive方法用法分析
  • php将文件夹打包成zip文件的简单实现方法
  • PHP读取zip文件的方法示例
  • php操作zip在不解压缩包的情况下显示压缩包中的图片
            
  • 分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    用户反馈
    客户端