返回列表 发帖

PHP实现在线解压代码

完整的代码如下:
  1. <?php
  2. //验证密码
  3. $password = "123";
  4. ?>
  5. <html>
  6. <head>
  7. <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
  8. <title>在线解压ZIP文件程序 V1.0</title>
  9. <style type="text/css">
  10. <!--
  11. body,td{
  12.         font-size: 14px;
  13.         color: #000000;
  14. }
  15. a {
  16.         color: #000066;
  17.         text-decoration: none;
  18. }
  19. a:hover {
  20.         color: #FF6600;
  21.         text-decoration: underline;
  22. }
  23. -->
  24. </style>
  25. </head>
  26. <body>
  27. <form name="myform" method="post" action="<?=$_SERVER[PHP_SELF];?>" enctype="multipart/form-data" onSubmit="return check_uploadObject(this);">
  28. <?
  29.         if(!$_REQUEST["myaction"]):
  30. ?>
  31. <script language="javascript">
  32. function check_uploadObject(form){
  33.         if(form.password.value==''){
  34.                 alert('请输入密码.');
  35.                 return false;
  36.         }
  37.         return true;
  38. }
  39. </script>
  40. <table width="100%" border="0" cellspacing="0" cellpadding="4">
  41.     <tr>
  42.       <td height="40" colspan="2" style="color:#FF9900"><p><font color="#FF0000">在线解压ZIP文件程序 V1.0</font></p>
  43.       <p>使用方法: 把zip文件通过FTP上传到本文件相同的目录下,选择zip文件;或直接点击“浏览...”上传zip文件。</p></td>
  44.     </tr>
  45.     <tr>
  46.       <td width="11%">选择ZIP文件: </td>
  47.       <td width="89%"><select name="zipfile">
  48.         <option value="" selected>- 请选择 -</option>
  49. <?
  50.           $fdir = opendir('./');
  51.         while($file=readdir($fdir)){
  52.                 if(!is_file($file)) continue;
  53.                 if(preg_match('/\.zip$/mis',$file)){
  54.                         echo "<option value='$file'>$file</option>\r\n";
  55.                 }
  56.         }
  57. ?>
  58.       </select></td>
  59.     </tr>
  60.     <tr>
  61.       <td width="11%" nowrap>或上传文件: </td>
  62.       <td width="89%"><input name="upfile" type="file" id="upfile" size="20"></td>
  63.     </tr>
  64.     <tr>
  65.       <td>解压到目录: </td>
  66.       <td><input name="todir" type="text" id="todir" value="__unzipfiles__" size="15">
  67.       (留空为本目录,必须有写入权限)</td>
  68.     </tr>
  69.     <tr>
  70.       <td>验证密码: </td>
  71.       <td><input name="password" type="password" id="password" size="15">
  72.       (源文件中设定的密码)</td>
  73.     </tr>        
  74.     <tr>
  75.       <td><input name="myaction" type="hidden" id="myaction" value="dounzip"></td>
  76.       <td><input type="submit" name="Submit" value=" 解 压 "></td>
  77.     </tr>
  78. </table>
  79. <?
  80. elseif($_REQUEST["myaction"]=="dounzip"):
  81. class zip
  82. {
  83. var $total_files = 0;
  84. var $total_folders = 0;
  85. function Extract ( $zn, $to, $index = Array(-1) )
  86. {
  87.    $ok = 0; $zip = @fopen($zn,'rb');
  88.    if(!$zip) return(-1);
  89.    $cdir = $this->ReadCentralDir($zip,$zn);
  90.    $pos_entry = $cdir['offset'];

  91.    if(!is_array($index)){ $index = array($index);  }
  92.    for($i=0; $index[$i];$i++){
  93.                    if(intval($index[$i])!=$index[$i]||$index[$i]>$cdir['entries'])
  94.                 return(-1);
  95.    }
  96.    for ($i=0; $i<$cdir['entries']; $i++)
  97.    {
  98.      @fseek($zip, $pos_entry);
  99.      $header = $this->ReadCentralFileHeaders($zip);
  100.      $header['index'] = $i; $pos_entry = ftell($zip);
  101.      @rewind($zip); fseek($zip, $header['offset']);
  102.      if(in_array("-1",$index)||in_array($i,$index))
  103.              $stat[$header['filename']]=$this->ExtractFile($header, $to, $zip);
  104.    }
  105.    fclose($zip);
  106.    return $stat;
  107. }
  108.   function ReadFileHeader($zip)
  109.   {
  110.     $binary_data = fread($zip, 30);
  111.     $data = unpack('vchk/vid/vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $binary_data);
  112.     $header['filename'] = fread($zip, $data['filename_len']);
  113.     if ($data['extra_len'] != 0) {
  114.       $header['extra'] = fread($zip, $data['extra_len']);
  115.     } else { $header['extra'] = ''; }
  116.     $header['compression'] = $data['compression'];$header['size'] = $data['size'];
  117.     $header['compressed_size'] = $data['compressed_size'];
  118.     $header['crc'] = $data['crc']; $header['flag'] = $data['flag'];
  119.     $header['mdate'] = $data['mdate'];$header['mtime'] = $data['mtime'];

  120.     if ($header['mdate'] && $header['mtime']){
  121.      $hour=($header['mtime']&0xF800)>>11;$minute=($header['mtime']&0x07E0)>>5;
  122.      $seconde=($header['mtime']&0x001F)*2;$year=(($header['mdate']&0xFE00)>>9)+1980;
  123.      $month=($header['mdate']&0x01E0)>>5;$day=$header['mdate']&0x001F;
  124.      $header['mtime'] = mktime($hour, $minute, $seconde, $month, $day, $year);
  125.     }else{$header['mtime'] = time();}

  126.     $header['stored_filename'] = $header['filename'];
  127.     $header['status'] = "ok";
  128.     return $header;
  129.   }
  130. function ReadCentralFileHeaders($zip){
  131.     $binary_data = fread($zip, 46);
  132.     $header = unpack('vchkid/vid/vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len/vcomment_len/vdisk/vinternal/Vexternal/Voffset', $binary_data);
  133.     if ($header['filename_len'] != 0)
  134.       $header['filename'] = fread($zip,$header['filename_len']);
  135.     else $header['filename'] = '';
  136.     if ($header['extra_len'] != 0)
  137.       $header['extra'] = fread($zip, $header['extra_len']);
  138.     else $header['extra'] = '';
  139.     if ($header['comment_len'] != 0)
  140.       $header['comment'] = fread($zip, $header['comment_len']);
  141.     else $header['comment'] = '';
  142.     if ($header['mdate'] && $header['mtime'])
  143.     {
  144.       $hour = ($header['mtime'] & 0xF800) >> 11;
  145.       $minute = ($header['mtime'] & 0x07E0) >> 5;
  146.       $seconde = ($header['mtime'] & 0x001F)*2;
  147.       $year = (($header['mdate'] & 0xFE00) >> 9) + 1980;
  148.       $month = ($header['mdate'] & 0x01E0) >> 5;
  149.       $day = $header['mdate'] & 0x001F;
  150.       $header['mtime'] = mktime($hour, $minute, $seconde, $month, $day, $year);
  151.     } else {
  152.       $header['mtime'] = time();
  153.     }
  154.     $header['stored_filename'] = $header['filename'];
  155.     $header['status'] = 'ok';
  156.     if (substr($header['filename'], -1) == '/')
  157.       $header['external'] = 0x41FF0010;
  158.     return $header;
  159. }
  160. function ReadCentralDir($zip,$zip_name){
  161.         $size = filesize($zip_name);
  162.         if ($size < 277) $maximum_size = $size;
  163.         else $maximum_size=277;
  164.         @fseek($zip, $size-$maximum_size);
  165.         $pos = ftell($zip); $bytes = 0x00000000;
  166.         while ($pos < $size){
  167.                 $byte = @fread($zip, 1); $bytes=($bytes << 8) | ord($byte);
  168.                 if ($bytes == 0x504b0506 or $bytes == 0x2e706870504b0506){ $pos++;break;} $pos++;
  169.         }
  170.         $fdata=fread($zip,18);
  171.         $data=@unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size',$fdata);
  172.         
  173.         if ($data['comment_size'] != 0) $centd['comment'] = fread($zip, $data['comment_size']);
  174.         else $centd['comment'] = ''; $centd['entries'] = $data['entries'];
  175.         $centd['disk_entries'] = $data['disk_entries'];
  176.         $centd['offset'] = $data['offset'];$centd['disk_start'] = $data['disk_start'];
  177.         $centd['size'] = $data['size'];  $centd['disk'] = $data['disk'];
  178.         return $centd;
  179.   }
  180. function ExtractFile($header,$to,$zip){
  181.         $header = $this->readfileheader($zip);
  182.         if(substr($to,-1)!="/") $to.="/";
  183.         if($to=='./') $to = '';        
  184.         $pth = explode("/",$to.$header['filename']);
  185.         $mydir = '';
  186.         for($i=0;$i<count($pth)-1;$i++){
  187.                 if(!$pth[$i]) continue;
  188.                 $mydir .= $pth[$i]."/";
  189.                 if((!is_dir($mydir) && @mkdir($mydir,0777)) || (($mydir==$to.$header['filename'] || ($mydir==$to && $this->total_folders==0)) && is_dir($mydir)) ){
  190.                         @chmod($mydir,0777);
  191.                         $this->total_folders ++;
  192.                         echo "<input name='dfile[]' type='checkbox' value='$mydir' checked> <a href='$mydir' target='_blank'>目录: $mydir</a><br>";
  193.                 }
  194.         }
  195.         if(strrchr($header['filename'],'/')=='/') return;        

  196.         if (!($header['external']==0x41FF0010)&&!($header['external']==16)){
  197.                 if ($header['compression']==0){
  198.                         $fp = @fopen($to.$header['filename'], 'wb');
  199.                         if(!$fp) return(-1);
  200.                         $size = $header['compressed_size'];   
  201.                         while ($size != 0){
  202.                                 $read_size = ($size < 2048 ? $size : 2048);
  203.                                 $buffer = fread($zip, $read_size);
  204.                                 $binary_data = pack('a'.$read_size, $buffer);
  205.                                 @fwrite($fp, $binary_data, $read_size);
  206.                                 $size -= $read_size;
  207.                         }
  208.                         fclose($fp);
  209.                         touch($to.$header['filename'], $header['mtime']);
  210.                 }else{
  211.                         $fp = @fopen($to.$header['filename'].'.gz','wb');
  212.                         if(!$fp) return(-1);
  213.                         $binary_data = pack('va1a1Va1a1', 0x8b1f, Chr($header['compression']),
  214.                         Chr(0x00), time(), Chr(0x00), Chr(3));
  215.                         
  216.                         fwrite($fp, $binary_data, 10);
  217.                         $size = $header['compressed_size'];
  218.                
  219.                         while ($size != 0){
  220.                                 $read_size = ($size < 1024 ? $size : 1024);
  221.                                 $buffer = fread($zip, $read_size);
  222.                                 $binary_data = pack('a'.$read_size, $buffer);
  223.                                 @fwrite($fp, $binary_data, $read_size);
  224.                                 $size -= $read_size;
  225.                         }
  226.                         $binary_data = pack('VV', $header['crc'], $header['size']);
  227.                         fwrite($fp, $binary_data,8); fclose($fp);
  228.         
  229.                         $gzp = @gzopen($to.$header['filename'].'.gz','rb') or die("Cette archive est compress閑");
  230.                         if(!$gzp) return(-2);
  231.                         $fp = @fopen($to.$header['filename'],'wb');
  232.                         if(!$fp) return(-1);
  233.                         $size = $header['size'];
  234.                         while ($size != 0){
  235.                                 $read_size = ($size < 2048 ? $size : 2048);
  236.                                 $buffer = gzread($gzp, $read_size);
  237.                                 $binary_data = pack('a'.$read_size, $buffer);
  238.                                 @fwrite($fp, $binary_data, $read_size);
  239.                                 $size -= $read_size;
  240.                         }
  241.                         fclose($fp); gzclose($gzp);
  242.                         touch($to.$header['filename'], $header['mtime']);
  243.                         @unlink($to.$header['filename'].'.gz');   
  244.                 }
  245.         }
  246.         $this->total_files ++;
  247.         echo "<input name='dfile[]' type='checkbox' value='$to$header[filename]' checked> <a href='$to$header[filename]' target='_blank'>文件: $to$header[filename]</a><br>";
  248.         return true;
  249. }
  250. // end class
  251. }
  252.         set_time_limit(0);
  253.         if ($_POST['password'] != $password) die("输入的密码不正确,请重新输入.");
  254.         if(!$_POST["todir"]) $_POST["todir"] = ".";
  255.         $z = new Zip;
  256.         $have_zip_file = 0;
  257.         function start_unzip($tmp_name,$new_name,$checked){
  258.                 global $_POST,$z,$have_zip_file;
  259.                 $upfile = array("tmp_name"=>$tmp_name,"name"=>$new_name);
  260.                 if(is_file($upfile[tmp_name])){
  261.                         $have_zip_file = 1;
  262.                         echo "<br>正在解压: <input name='dfile[]' type='checkbox' value='$upfile[name]' ".($checked?"checked":"")."> $upfile[name]<br><br>";
  263.                         if(preg_match('/\.zip$/mis',$upfile[name])){
  264.                                 $result=$z->Extract($upfile[tmp_name],$_POST["todir"]);
  265.                                 if($result==-1){
  266.                                         echo "<br>文件 $upfile[name] 错误.<br>";
  267.                                 }
  268.                                 echo "<br>完成,共建立 $z->total_folders 个目录,$z->total_files 个文件.<br><br><br>";
  269.                         }else{
  270.                                 echo "<br>$upfile[name] 不是 zip 文件.<br><br>";                        
  271.                         }
  272.                         if(realpath($upfile[name])!=realpath($upfile[tmp_name])){
  273.                                 @unlink($upfile[name]);
  274.                                 rename($upfile[tmp_name],$upfile[name]);
  275.                         }
  276.                 }
  277.         }
  278.         clearstatcache();
  279.         start_unzip($_POST["zipfile"],$_POST["zipfile"],0);
  280.         start_unzip($_FILES["upfile"][tmp_name],$_FILES["upfile"][name],1);
  281.         if(!$have_zip_file){
  282.                 echo "<br>请选择或上传文件.<br>";
  283.         }
  284. ?>
  285. <input name="password" type="hidden" id="password" value="<?=$_POST['password'];?>">
  286. <input name="myaction" type="hidden" id="myaction" value="dodelete">
  287. <input name="按钮" type="button" value="返回" onclick="window.location='<?=$_SERVER[PHP_SELF];?>';">
  288. <input type='button' value='反选' onclick='selrev();'> <input type='submit' onclick='return confirm("删除选定文件?");' value='删除选定'>
  289. <script language='javascript'>
  290. function selrev() {
  291.         with(document.myform) {
  292.                 for(i=0;i<elements.length;i++) {
  293.                         thiselm = elements[i];
  294.                         if(thiselm.name.match(/dfile\[]/))        thiselm.checked = !thiselm.checked;
  295.                 }
  296.         }
  297. }
  298. alert('完成.');
  299. </script>
  300. <?
  301. elseif($_REQUEST["myaction"]=="dodelete"):
  302.         set_time_limit(0);
  303.         if ($_POST['password'] != $password) die("输入的密码不正确,请重新输入.");
  304.         $dfile = $_POST["dfile"];
  305.         echo "正在删除文件...<br><br>";
  306.         if(is_array($dfile)){
  307.                 for($i=count($dfile)-1;$i>=0;$i--){
  308.                         if(is_file($dfile[$i])){
  309.                                 if(@unlink($dfile[$i])){
  310.                                         echo "已删除文件: $dfile[$i]<br>";
  311.                                 }else{
  312.                                         echo "删除文件失败: $dfile[$i]<br>";
  313.                                 }
  314.                         }else{
  315.                                 if(@rmdir($dfile[$i])){
  316.                                         echo "已删除目录: $dfile[$i]<br>";
  317.                                 }else{
  318.                                         echo "删除目录失败: $dfile[$i]<br>";
  319.                                 }                                
  320.                         }   
  321.                 }
  322.         }
  323.         echo "<br>完成.<br><br><input type='button' value='返回' onclick=\"window.location='$_SERVER[PHP_SELF]';\"><br><br>
  324.                  <script language='javascript'>('完成.');</script>";

  325. endif;
  326. ?>
  327. </form>
  328. </body>
  329. </html>
复制代码

返回列表