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


Posted in PHP onFebruary 13, 2016

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

<?php
//在URL后参加 ?pwd=密码 查看生成密码
$password = '8baa717e6265d1c1d762cc896151f821'; //l23
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>php ZIP压缩程序</title>
<style type="text/css">
<!--
html{background:#f9f9f9;}body{background:#fff;color:#333;font-family:sans-serif;margin:2em auto;width:700px;padding:1em 2em;-moz-border-radius:11px;-khtml-border-radius:11px;-webkit-border-radius:11px;border-radius:11px;border:1px solid #dfdfdf;}a{color:#2583ad;text-decoration:none;}a:hover{color:#d54e21;}h1{border-bottom:1px solid #dadada;clear:both;color:#666;font:24px Georgia,"Times New Roman",Times,serif;margin:5px 0 0 -4px;padding:0;padding-bottom:7px;}h2{font-size:16px;}p,li,dd,dt{padding-bottom:2px;font-size:12px;line-height:18px;}code,.code{font-size:13px;}ul,ol,dl{padding:5px 5px 5px 22px;}a img{border:0;}abbr{border:0;font-variant:normal;}#logo{margin:6px 0 14px 0;border-bottom:none;text-align:center;}.step{margin:20px 0 15px;}.step,th{text-align:left;padding:0;}.submit input,.button,.button-secondary{font-family:sans-serif;text-decoration:none;font-size:14px!important;line-height:16px;padding:6px 12px;cursor:pointer;border:1px solid #bbb;color:#464646;-moz-border-radius:15px;-khtml-border-radius:15px;-webkit-border-radius:15px;border-radius:15px;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;-khtml-box-sizing:content-box;box-sizing:content-box;}.button:hover,.button-secondary:hover,.submit input:hover{color:#000;border-color:#666;}textarea{border:1px solid #bbb;-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}.form-table{border-collapse:collapse;margin-top:1em;width:100%;}.form-table td{margin-bottom:9px;padding:10px;border-bottom:8px solid #fff;font-size:12px;}.form-table th{font-size:13px;text-align:left;padding:16px 10px 10px 10px;border-bottom:8px solid #fff;width:130px;vertical-align:top;}.form-table tr{background:#f3f3f3;}.form-table code{line-height:18px;font-size:18px;}.form-table p{margin:4px 0 0 0;font-size:11px;}.form-table input{line-height:20px;font-size:15px;padding:2px;}.form-table th p{font-weight:normal;}#error-page{margin-top:50px;}#error-page p{font-size:12px;line-height:18px;margin:25px 0 20px;}#error-page code,.code{font-family:Consolas,Monaco,monospace;}#pass-strength-result{background-color:#eee;border-color:#ddd!important;border-style:solid;border-width:1px;margin:5px 5px 5px 1px;padding:5px;text-align:center;width:200px;display:none;}#pass-strength-result.bad{background-color:#ffb78c;border-color:#ff853c!important;}#pass-strength-result.good{background-color:#ffec8b;border-color:#fc0!important;}#pass-strength-result.short{background-color:#ffa0a0;border-color:#f04040!important;}#pass-strength-result.strong{background-color:#c3ff88;border-color:#8dff1c!important;}.message{border:1px solid #e6db55;padding:.3em .6em;margin:5px 0 15px;background-color:#ffffe0;}
.mydirname {color:#F00;}
.myfilename {color:#649ABE;}
.currentdir {font-size:14px;font-family: Georgia, Consolas;font-weight:bold;}
#footer {text-align:center;margin-top:20px;}
-->
</style>
</head>
 
<body>
 <form name="myform" id="myform" method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
<h1 style="color:#2583ad;">在线压缩ZIP文件程序</h1><br>
 
<div>
   <p>使用方法:选定要压缩的文件或目录(包含子目录),即可开始压缩。压缩的结果保留原来的目录结构。<br />
   <?php if(isset($_REQUEST['pwd']) && md5($_REQUEST['pwd']) == $password)
   echo '当前目录:<span>'. dirname(__FILE__) . '</span>        <a href="'.
   $_SERVER['PHP_SELF']. '">退出</a>';
     else
      if(isset($_GET['pwd']) )
        echo '密码值:<span>'. md5($_GET['pwd']) . '</span>';
      else
        echo 'Tips:在URL后参加<span>?pwd=密码</span> 查看生成密码.';
    ?>
   </p>
</div>
<?
if(!isset($_REQUEST["myaction"])):
?>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
  <tr>
   <td width="11%">验证密码: </td>
   <td width="89%"><input name="pwd" type="password" id="password" size="30" onkeydown="if(event.ctrlKey&&event.keyCode==13){document.getElementById('login').click();return false};"></td>
  </tr>
  <tr>
   <td><input name="myaction" type="hidden" id="myaction" value="dolist"></td>
   <td><input type="submit" name="Submit" id="login" value=" 进 入 "></td>
  </tr>
 </table>
 <script type="text/javascript">
 document.getElementById('password').focus();
 </script>
<?
 
elseif($_REQUEST["myaction"]=="dolist"):
 
  if(!isset($_REQUEST['pwd']) || empty($_REQUEST['pwd']) )
    die('请输入密码! <a href="'. $_SERVER['PHP_SELF']. '">Again</a>');
  if(md5($_REQUEST['pwd']) != $password)
    die('输入的密码不正确!<a href="'. $_SERVER['PHP_SELF']. '">Again</a>');
echo '选择要排除的目录(相对路径,以英文半角逗号分隔):<br />';
echo '<input type="text" id="toexlude" name="toexlude" size="100" /><br />';
  echo "选择要压缩的文件或目录:<br/>";
   $fdir = opendir('./');
  while($file=readdir($fdir)){
    if($file=='.'|| $file=='..' ) continue;
    echo "<input name='dfile[]' type='checkbox' value='$file' ".($file==basename(__FILE__)?"":"checked")."> ";
    if(is_file($file)){
      echo "<span>文件: $file</span><br>";
    }else{
      echo "<span>目录: $file</span><br>";
    }
  }
?>
<br>
压缩文件保存到目录:
<input name="todir" type="text" id="todir" value="_zipfiles<?php echo substr(md5(time()),0,8);?>_" size="20">
(留空为本目录,必须有写入权限)<br>
压缩文件名称:
<input name="zipname" type="text" id="zipname" value="backup_<?php echo substr(md5(__FILE__),0,8);?>.zip" size="15">
(.zip)<br>
<br>
<input name="pwd" type="hidden" id="password" value="<?php echo $_POST['pwd'];?>">
<input name="myaction" type="hidden" id="myaction" value="dozip">
<input type='button' value='反选' onclick='selrev();'>
<input type="submit" name="Submit" value=" 开始压缩 ">
<script language='javascript'>
function selrev() {
  with(document.getElementById('myform')){
    for(i=0;i<elements.length;i++) {
      thiselm = elements[i];
      if(thiselm.name.match(/dfile\[]/))  thiselm.checked = !thiselm.checked;
    }
  }
}
</script>
<?
 
elseif($_REQUEST["myaction"]=="dozip"):
 
// set_time_limit(0);
 
 class PHPzip{
 
  var $file_count = 0 ;
  var $datastr_len  = 0;
  var $dirstr_len = 0;
  var $filedata = ''; //该变量只被类外部程序访问
  var $gzfilename;
  var $fp;
  var $dirstr='';
  /*
  返回文件的修改时间格式.
  只为本类内部函数调用.
  */
  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 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<count($bitunit);$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'])){
    $faisunZIP = new PHPzip;
    if($faisunZIP -> startfile($_REQUEST['todir'].$_REQUEST['zipname'])){
      echo "正在添加压缩文件...<br><br>";
      $filenum = 0;
      foreach($_REQUEST['dfile'] as $file){
        if(is_file($file)){
          echo "<span>文件: $file </span><br>";
        }else{
          echo "<span>目录: $file </span><br>";
        }
        $filenum += listfiles($file);
      }
      $faisunZIP -> createfile();
      echo "<br>压缩完成,共添加 $filenum 个文件.<br /><a href='" .$_REQUEST['todir'].$_REQUEST['zipname']. "'>". $_REQUEST['todir'].$_REQUEST['zipname']." (".num_bitunit(filesize("$_REQUEST[todir]$_REQUEST[zipname]")).")</a>";
    }else{
      echo $_REQUEST['todir'].$_REQUEST['zipname'].'不能写入,请检查路径或权限是否正确.<br>';
    }
  }else{
    echo "没有选择的文件或目录.<br>";
  }
 
 
endif;
 
?>
 </form>
 <div id="footer">
 <p> <a href="javascript:;" onclick="scrollTo(0,0);" title="返回顶部">TOP</a></p>
 </div>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助。

PHP 相关文章推荐
php 动态添加记录
Mar 10 PHP
php print EOF实现方法
May 21 PHP
php中几种常见安全设置详解
Apr 06 PHP
php小技巧 把数组的键和值交换形成了新的数组,查找值取得键
Jun 02 PHP
php _autoload自动加载类与机制分析
Feb 10 PHP
简单的方法让你的后台登录更加安全(php中加session验证)
Aug 22 PHP
解析php中die(),exit(),return的区别
Jun 20 PHP
ThinkPHP实现跨模块调用操作方法概述
Jun 20 PHP
PHP获取POST数据的几种方法汇总
Mar 03 PHP
php替换字符串中间字符为省略号的方法
May 04 PHP
php使用escapeshellarg时中文被过滤的解决方法
Jul 10 PHP
PHP实现执行外部程序的方法详解
Aug 17 PHP
php session 写入数据库
Feb 13 #PHP
php等比例缩放图片及剪切图片代码分享
Feb 13 #PHP
PHP信号量基本用法实例详解
Feb 12 #PHP
PHP消息队列用法实例分析
Feb 12 #PHP
PHP共享内存用法实例分析
Feb 12 #PHP
PHP连接MSSQL方法汇总
Feb 05 #PHP
Symfony2开发之控制器用法实例分析
Feb 05 #PHP
You might like
PHP5中虚函数的实现方法分享
2011/04/20 PHP
php中将html中的br换行符转换为文本输入中的换行符
2013/03/26 PHP
php计算一个文件大小的方法
2015/03/30 PHP
php事务回滚简单实现方法示例
2017/03/28 PHP
Jquery Ajax学习实例7 Ajax所有过程事件分析示例
2010/03/23 Javascript
基于jquery自定义图片热区效果
2012/07/21 Javascript
nodejs中操作mysql数据库示例
2014/12/20 NodeJs
JavaScript定时器和优化的取消定时器方法
2015/07/03 Javascript
jQuery实现的进度条效果
2015/07/15 Javascript
详解javascript遍历方式
2015/11/11 Javascript
Bootstrap选项卡动态切换效果
2016/11/28 Javascript
浅谈js中同名函数和同名变量的执行问题
2017/02/12 Javascript
VUE脚手架的下载和配置步骤详解
2019/04/01 Javascript
深入了解Hybrid App技术的相关知识
2019/07/17 Javascript
使用JavaScript计算前一天和后一天的思路详解
2019/12/20 Javascript
小程序实现上下切换位置
2020/11/16 Javascript
python统计字符串中指定字符出现次数的方法
2015/04/04 Python
Python如何实现文本转语音
2016/08/08 Python
selenium+python实现1688网站验证码图片的截取功能
2018/08/14 Python
python 通过SSHTunnelForwarder隧道连接redis的方法
2019/02/19 Python
python网络应用开发知识点浅析
2019/05/28 Python
python脚本执行CMD命令并返回结果的例子
2019/08/14 Python
Win10+GPU版Pytorch1.1安装的安装步骤
2019/09/27 Python
python shapely.geometry.polygon任意两个四边形的IOU计算实例
2020/04/12 Python
python rsa-oaep加密的示例代码
2020/09/23 Python
Python实现曲线拟合的最小二乘法
2021/02/19 Python
妇产医师自荐信
2014/01/29 职场文书
班级入场式解说词
2014/02/01 职场文书
2014社区三八妇女节活动方案
2014/03/30 职场文书
《棉鞋里的阳光》教学反思
2014/04/24 职场文书
优秀毕业生自荐信
2014/06/10 职场文书
有关浪费资源的建议书
2015/09/14 职场文书
周一给客户的问候语
2015/11/10 职场文书
2016年度先进班组事迹材料
2016/03/01 职场文书
Nginx四层负载均衡的配置指南
2021/06/11 Servers
Golang 字符串的常见操作
2022/04/19 Golang