php实现文件在线解压

<?php
//验证密码
$password = "123456";
?>
<html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>Faisun_unzip - 纯粹空间 - www.softpure.com</title>
<style type="text/css"> <!--
body,td{
  font-size: 14px;
  color: #000000;
}
a {
  color: #000066;
  text-decoration: none;
}
a:hover {
  color: #FF6600;
  text-decoration: underline;
}
-->
</style>
</head>

<body >
  <form name="myform" method="post" action="<?=$_SERVER[PHP_SELF];?>" enctype="multipart/form-data" onSubmit="return check_uploadObject(this);">
<?
  if(!$_REQUEST["myaction"]):
?>

<script language="javascript">
function check_uploadObject(form){
  if(form.password.value==''){
    alert('请输入密码.');
    return false;
  }
  return true;
}
</script>

<table width="100%" border="0" cellspacing="0" cellpadding="4">
    <tr>
      <td height="40" colspan="2" style="color:#FF9900"><p><font color="#FF0000">faisun_unzip -在线解压ZIP文件程序 V1.0</font></p>
    <p>转载请注明:本程序由 <a href="http://www.softpure.com/" target="_blank">纯粹空间</a>(<a href="http://www.softpure.com/" target="_blank">http://www.softpure.com</a>) 提供,作者:faisun(<a href="mailto:faisun@sina.com">faisun@sina.com</a>).</p>
      <p>使用方法:把zip文件通过FTP上传到本文件相同的目录下,选择zip文件;或直接点击“浏览...”上传zip文件。</p>
      <p>解压的结果保留原来的目录结构。</p>
      <p> </p></td>
    </tr>
    <tr>
      <td width="11%">选择ZIP文件: </td>
      <td width="89%"><select name="zipfile">
        <option value="" selected>- 请选择 -</option>
<?
    $fdir = opendir('./');
  while($file=readdir($fdir)){
    if(!is_file($file)) continue;
    if(preg_match('/\.zip$/mis',$file)){
      echo "<option value='$file'>$file</option>\r\n";
    }
  }
?>
      </select></td>
    </tr>
    <tr>
      <td width="11%" nowrap>或上传文件: </td>
      <td width="89%"><input name="upfile" type="file" id="upfile" size="20"></td>
    </tr>
  <tr>
      <td>解压到目录: </td>
      <td><input name="todir" type="text" id="todir" value="__unzipfiles__" size="15">
      (留空为本目录,必须有写入权限)</td>
    </tr>
  <tr>
      <td>验证密码: </td>
      <td><input name="password" type="password" id="password" size="15">
        (源文件中设定的密码)</td>
    </tr>  
    <tr>
      <td><input name="myaction" type="hidden" id="myaction" value="dounzip"></td>
      <td><input type="submit" name="Submit" value=" 解 压 "></td>
    </tr>
  </table>

<?

elseif($_REQUEST["myaction"]=="dounzip"):

class zip
{

var $total_files = 0;
var $total_folders = 0;

function Extract ( $zn, $to, $index = Array(-1) )
{
   $ok = 0; $zip = @fopen($zn,'rb');
   if(!$zip) return(-1);
   $cdir = $this->ReadCentralDir($zip,$zn);
   $pos_entry = $cdir['offset'];

   if(!is_array($index)){ $index = array($index);  }
   for($i=0; $index[$i];$i++){
       if(intval($index[$i])!=$index[$i]||$index[$i]>$cdir['entries'])
    return(-1);
   }
   for ($i=0; $i<$cdir['entries']; $i++)
   {
     @fseek($zip, $pos_entry);
     $header = $this->ReadCentralFileHeaders($zip);
     $header['index'] = $i; $pos_entry = ftell($zip);
     @rewind($zip); fseek($zip, $header['offset']);
     if(in_array("-1",$index)||in_array($i,$index))
       $stat[$header['filename']]=$this->ExtractFile($header, $to, $zip);
   }
   fclose($zip);
   return $stat;
}

  function ReadFileHeader($zip)
  {
    $binary_data = fread($zip, 30);
    $data = unpack('vchk/vid/vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $binary_data);

    $header['filename'] = fread($zip, $data['filename_len']);
    if ($data['extra_len'] != 0) {
      $header['extra'] = fread($zip, $data['extra_len']);
    } else { $header['extra'] = ''; }

    $header['compression'] = $data['compression'];$header['size'] = $data['size'];
    $header['compressed_size'] = $data['compressed_size'];
    $header['crc'] = $data['crc']; $header['flag'] = $data['flag'];
    $header['mdate'] = $data['mdate'];$header['mtime'] = $data['mtime'];

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

    $header['stored_filename'] = $header['filename'];
    $header['status'] = "ok";
    return $header;
  }

function ReadCentralFileHeaders($zip){
    $binary_data = fread($zip, 46);
    $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);

    if ($header['filename_len'] != 0)
      $header['filename'] = fread($zip,$header['filename_len']);
    else $header['filename'] = '';

    if ($header['extra_len'] != 0)
      $header['extra'] = fread($zip, $header['extra_len']);
    else $header['extra'] = '';

    if ($header['comment_len'] != 0)
      $header['comment'] = fread($zip, $header['comment_len']);
    else $header['comment'] = '';

    if ($header['mdate'] && $header['mtime'])
    {
      $hour = ($header['mtime'] & 0xF800) >> 11;
      $minute = ($header['mtime'] & 0x07E0) >> 5;
      $seconde = ($header['mtime'] & 0x001F)*2;
      $year = (($header['mdate'] & 0xFE00) >> 9) + 1980;
      $month = ($header['mdate'] & 0x01E0) >> 5;
      $day = $header['mdate'] & 0x001F;
      $header['mtime'] = mktime($hour, $minute, $seconde, $month, $day, $year);
    } else {
      $header['mtime'] = time();
    }
    $header['stored_filename'] = $header['filename'];
    $header['status'] = 'ok';
    if (substr($header['filename'], -1) == '/')
      $header['external'] = 0x41FF0010;
    return $header;
}

function ReadCentralDir($zip,$zip_name){
  $size = filesize($zip_name);

  if ($size < 277) $maximum_size = $size;
  else $maximum_size=277;
  
  @fseek($zip, $size-$maximum_size);
  $pos = ftell($zip); $bytes = 0x00000000;
  
  while ($pos < $size){
    $byte = @fread($zip, 1); $bytes=($bytes << 8) | ord($byte);
    if ($bytes == 0x504b0506 or $bytes == 0x2e706870504b0506){ $pos++;break;} $pos++;
  }
  
  $fdata=fread($zip,18);
  
  $data=@unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size',$fdata);
  
  if ($data['comment_size'] != 0) $centd['comment'] = fread($zip, $data['comment_size']);
  else $centd['comment'] = ''; $centd['entries'] = $data['entries'];
  $centd['disk_entries'] = $data['disk_entries'];
  $centd['offset'] = $data['offset'];$centd['disk_start'] = $data['disk_start'];
  $centd['size'] = $data['size'];  $centd['disk'] = $data['disk'];
  return $centd;
  }

function ExtractFile($header,$to,$zip){
  $header = $this->readfileheader($zip);
  
  if(substr($to,-1)!="/") $to.="/";
  if($to=='./') $to = '';  
  $pth = explode("/",$to.$header['filename']);
  $mydir = '';
  for($i=0;$i<count($pth)-1;$i++){
    if(!$pth[$i]) continue;
    $mydir .= $pth[$i]."/";
    if((!is_dir($mydir) && @mkdir($mydir,0777)) || (($mydir==$to.$header['filename'] || ($mydir==$to && $this->total_folders==0)) && is_dir($mydir)) ){
      @chmod($mydir,0777);
      $this->total_folders ++;
      echo "<input name='dfile[]' type='checkbox' value='$mydir' checked> <a href='$mydir' target='_blank'>目录: $mydir</a><br>";
    }
  }
  
  if(strrchr($header['filename'],'/')=='/') return;  

  if (!($header['external']==0x41FF0010)&&!($header['external']==16)){
    if ($header['compression']==0){
      $fp = @fopen($to.$header['filename'], 'wb');
      if(!$fp) return(-1);
      $size = $header['compressed_size'];
    
      while ($size != 0){
        $read_size = ($size < 2048 ? $size : 2048);
        $buffer = fread($zip, $read_size);
        $binary_data = pack('a'.$read_size, $buffer);
        @fwrite($fp, $binary_data, $read_size);
        $size -= $read_size;
      }
      fclose($fp);
      touch($to.$header['filename'], $header['mtime']);
    }else{
      $fp = @fopen($to.$header['filename'].'.gz','wb');
      if(!$fp) return(-1);
      $binary_data = pack('va1a1Va1a1', 0x8b1f, Chr($header['compression']),
      Chr(0x00), time(), Chr(0x00), Chr(3));
      
      fwrite($fp, $binary_data, 10);
      $size = $header['compressed_size'];
    
      while ($size != 0){
        $read_size = ($size < 1024 ? $size : 1024);
        $buffer = fread($zip, $read_size);
        $binary_data = pack('a'.$read_size, $buffer);
        @fwrite($fp, $binary_data, $read_size);
        $size -= $read_size;
      }
    
      $binary_data = pack('VV', $header['crc'], $header['size']);
      fwrite($fp, $binary_data,8); fclose($fp);
  
      $gzp = @gzopen($to.$header['filename'].'.gz','rb') or die("Cette archive est compress

时间: 2024-07-29 06:24:53

php实现文件在线解压的相关文章

php 文件在线解压代码

public function ExtractFile($header,$to,$zip) {   $header = $this->readfileheader($zip);   if (substr($to,-1)!="/") $to.="/";   if ($to=='./') $to = '';   $pth = explode("/",$to.$header['filename']);   $mydir = '';   for($

php解压文件代码实现php在线解压

 这篇文章主要介绍了php解压文件代码,根据这个代码可以实现php在线解压功能,需要的朋友可以参考下  代码如下: <?php $zip = zip_open("moooredale.zip");   if ($zip) {    while ($zip_entry = zip_read($zip)) {    $fp = fopen(zip_entry_name($zip_entry), "w");    if (zip_entry_open($zip, $

php在线解压ZIP文件的方法

这篇文章主要介绍了php在线解压ZIP文件的方法,包含了较为完整的上传与zip解压功能,非常具有实用价值,需要的朋友可以参考下     本文实例讲述了php在线解压ZIP文件的方法.分享给大家供大家参考.具体分析如下: 在PHP的函数库中只找到了个ZLIB的函数还跟压缩有点关系,但是使我失望的是他没能解ZIP的文件,但最后还是让我找到了解决的方法,就是通过PHP的程序执行函数来实现这个功能,因为现在能解ZIP文件的东西实在是太多啦,你要是不信,可以到有下载软件的地方找找看,保准你不会失望的,我的

虚拟主机RAR在线解压和在线压缩

虚拟主机RAR在线解压有什么好处:可以大幅度的减少上传时间,可以确保资料的完整性(比如您的网站有几百到几千个文件,您不可能用FTP完整的传上去,那么多文件传漏或传断线那都是很正常的事情),如果把您的站点打包成RAR文件 那么传一个RAR文件,就完全可以保证资料一个都不少. 1.把您的网站打包成RAR文件(比如abc.rar),传到FTP的DB文件夹 2.使用您的用户名和密码登陆本站(按照以下步骤点击) 3.自助管理--主机管理--操作下的管理 --[网站打包/还原]--"网站还原"--

不可预料的压缩文件末端解压出错解决方法

"不可预料的压缩文件末端"多出现于压缩文件未下载完成,由于服务器失去响应,导致系统误以为文件已经下载完毕,将不完整的文件当成了完整的.建议把文件删除了重新下载,如果始终有问题则是资源的问题.不可预料的压缩文件末端解压出错的解决办法如下: 第一步:下载安装"Advanced RAR Repair"程序. 第二步:下载解压缩后,双击打开"Advanced RAR Repair"程序. 第三步:在"选择RAR或自解压文档进行修复"项

mdb文件怎么解压

mdb文件怎么解压?不知道大家有没有接触过,现在在网上有一种mdb格式的的压缩格式,具体叫什么也不清楚.但是解压这样的文件,用常用的rar解压软件是无法解开的,那么mdb文件怎么解压呢? 相信大家都知道,mdb文件是是数据库文件,有网友在百度知道上提问mdb文件怎么解压很多人回复mdb不用解压,用Access打开就可以了.但相信真正提问的用户肯定对这样的答案不会满意的. 其实mdb压缩文件多见于木马的打包,通常是用这种形式把网站所有内容包括图片整体打包,有的为HSH.mdb有的可能是Packet

服务器-c# 解压文件的 解压之后没有存进数据库 没有看的解压之后 文件

问题描述 c# 解压文件的 解压之后没有存进数据库 没有看的解压之后 文件 Stream stream = HttpContext.Current.Request.InputStream; account = HttpContext.Current.Request.Params["Account"]; if (account == null || account == "") { account = "unknown"; } desZipFile

win7下载gz文件,解压时弹出文件损坏,重新下载了好几次都是这个情况,求大神啊

问题描述 win7下载gz文件,解压时弹出文件损坏,重新下载了好几次都是这个情况,求大神啊 win7下载gz文件,解压时弹出文件损坏,重新下载了好几次都是这个情况,求大神啊 解决方案 要么就是本身文件有损坏,或者你的网络环境不好,导致下载出错 解决方案二: 换个解压文件试试,或者用命令解压 解决方案三: 换一个解压工具吧,TCP协议是面向连接的可靠协议,使用他传输的数据是可靠的,所以一般不会是因为下载中出现的数据错误,还有一种可能就是服务器上这个文件本身就是损坏的 解决方案四: 确实是文件损坏了

主题切换-android 墨迹换肤下载皮肤zip文件,解压至系统目录,后该如何跟换字体颜色

问题描述 android 墨迹换肤下载皮肤zip文件,解压至系统目录,后该如何跟换字体颜色 android 墨迹换肤下载之后解压到/data/data/[pkg]/files,可是系统要换字体颜色的时候,怎么替换过去呢,context.getColor,得到的还是默认的颜色,大神在哪里,求指引 解决方案 http://blog.csdn.net/t12x3456/article/details/7936173