热搜词
发表于 2010-3-3 16:19:27 | 显示全部楼层 |阅读模式
本帖最后由 灰儿 于 2010-3-3 16:34 编辑

用php实现的在线打包的工具,并可以支持子目录使用纯php对目录和文件进行打包压缩,压缩当然不能跟winrar比(压缩比差不多相当于winrar压缩时的最快模式)。
  程序使用了php的zip扩展,如果服务器支持,那就可以用了^_^,生成的zip压缩包可以用winrar等来解压的,当然也可以用php来解压。解压的过段时间再发布了。

本程序由 http://www.softpure.com/纯粹空间提供,
作者:faisun   mail :faisun@sina.com


  1. <?php
  2. //验证密码
  3. $password = "123456";
  4. ?>
  5. <html>
  6. <head>
  7. <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
  8. <title>压缩文件</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];?>">
  28. <font color="#FF0000"> faisun_zip -在线压缩ZIP文件程序 V1.0</font><br>
  29. <div style="color:#FF9900">
  30.    <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="faisun@sina.com).mailto:faisun@sina.com">faisun@sina.com</a>).</p>
  31.       <p>使用方法:选定要压缩的文件或目录(包含子目录),即可开始压缩。</p>
  32.       <p>压缩的结果保留原来的目录结构。</p>
  33. </div>
  34. <?
  35. if(!$_REQUEST["myaction"]):
  36. ?>
  37. <table width="100%" border="0" cellspacing="0" cellpadding="0">
  38. <tr>
  39.       <td width="11%">验证密码: </td>
  40.       <td width="89%"><input name="password" type="password" id="password" size="15">
  41.       (源文件中设定的密码) </td>
  42.     </tr>
  43.     <tr>
  44.       <td><input name="myaction" type="hidden" id="myaction" value="dolist"></td>
  45.       <td><input type="submit" name="Submit" value=" 进 入 "></td>
  46.     </tr>
  47. </table>
  48. <?
  49. elseif($_REQUEST["myaction"]=="dolist"):
  50. if($_REQUEST['password'] != $password) die("输入的密码不正确,请重新输入。");
  51. echo "选择要压缩的文件或目录:<br>";
  52. $fdir = opendir('./');
  53. while($file=readdir($fdir)){
  54.    if($file=='.'|| $file=='..') continue;
  55.    echo "<input name='dfile[]' type='checkbox' value='$file' ".($file==basename(__FILE__)?"":"checked")."> ";
  56.    if(is_file($file)){
  57.     echo "文件: $file<br>";
  58.    }else{
  59.     echo "目录: $file<br>";
  60.    }
  61. }
  62. ?>
  63. <br>
  64. 压缩文件保存到目录:
  65. <input name="todir" type="text" id="todir" value="__zipfiles__" size="15">
  66. (留空为本目录,必须有写入权限)<br>
  67. 压缩文件名称:
  68. <input name="zipname" type="text" id="zipname" value="faisunzip.zip" size="15">
  69. (.zip)<br>
  70. <br>
  71. <input name="password" type="hidden" id="password" value="<?=$_POST['password'];?>">
  72. <input name="myaction" type="hidden" id="myaction" value="dozip">
  73. <input type='button' value='反选' onclick='selrev();'>
  74. <input type="submit" name="Submit" value=" 开始压缩 ">
  75. <script language='javascript'>
  76. function selrev() {
  77. with(document.myform) {
  78.    for(i=0;i<elements.length;i++) {
  79.     thiselm = elements;
  80.     if(thiselm.name.match(/dfile\[]/)) thiselm.checked = !thiselm.checked;
  81.    }
  82. }
  83. }
  84. </script>
  85. <?
  86. elseif($_REQUEST["myaction"]=="dozip"):
  87. set_time_limit(0);
  88. class PHPzip{
  89. var $file_count = 0 ;
  90. var $datastr_len   = 0;
  91. var $dirstr_len = 0;
  92. var $filedata = ''; //该变量只被类外部程序访问
  93. var $gzfilename;
  94. var $fp;
  95. var $dirstr='';
  96. /*
  97. 返回文件的修改时间格式.
  98. 只为本类内部函数调用.
  99. */
  100.     function unix2DosTime($unixtime = 0) {
  101.         $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
  102.         if ($timearray['year'] < 1980) {
  103.         $timearray['year']    = 1980;
  104.         $timearray['mon']     = 1;
  105.         $timearray['mday']    = 1;
  106.         $timearray['hours']   = 0;
  107.         $timearray['minutes'] = 0;
  108.         $timearray['seconds'] = 0;
  109.         }
  110.         return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |
  111.                ($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);
  112.     }
  113. /*
  114. 初始化文件,建立文件目录,
  115. 并返回文件的写入权限.
  116. */
  117. function startfile($path = 'faisun.zip'){
  118.    $this->gzfilename=$path;
  119.    $mypathdir=array();
  120.    do{
  121.     $mypathdir[] = $path = dirname($path);
  122.    }while($path != '.');
  123.    @end($mypathdir);
  124.    do{
  125.     $path = @current($mypathdir);
  126.     @mkdir($path);
  127.    }while(@prev($mypathdir));
  128.    if($this->fp=@fopen($this->gzfilename,"w")){
  129.     return true;
  130.    }
  131.    return false;
  132. }
  133. /*
  134. 添加一个文件到 zip 压缩包中.
  135. */
  136.     function addfile($data, $name){
  137.         $name     = str_replace('\\', '/', $name);
  138.   
  139.    if(strrchr($name,'/')=='/') return $this->adddir($name);
  140.   
  141.         $dtime    = dechex($this->unix2DosTime());
  142.         $hexdtime = '\x' . $dtime[6] . $dtime[7]
  143.                   . '\x' . $dtime[4] . $dtime[5]
  144.                   . '\x' . $dtime[2] . $dtime[3]
  145.                   . '\x' . $dtime[0] . $dtime[1];
  146.         eval('$hexdtime = "' . $hexdtime . '";');
  147.         $unc_len = strlen($data);
  148.         $crc     = crc32($data);
  149.         $zdata   = gzcompress($data);
  150.         $c_len   = strlen($zdata);
  151.         $zdata   = substr(substr($zdata, 0, strlen($zdata) - 4), 2);
  152.   
  153.    //新添文件内容格式化:
  154.         $datastr = "\x50\x4b\x03\x04";
  155.         $datastr .= "\x14\x00";            // ver needed to extract
  156.         $datastr .= "\x00\x00";            // gen purpose bit flag
  157.         $datastr .= "\x08\x00";            // compression method
  158.         $datastr .= $hexdtime;             // last mod time and date
  159.         $datastr .= pack('V', $crc);             // crc32
  160.         $datastr .= pack('V', $c_len);           // compressed filesize
  161.         $datastr .= pack('V', $unc_len);         // uncompressed filesize
  162.         $datastr .= pack('v', strlen($name));    // length of filename
  163.         $datastr .= pack('v', 0);                // extra field length
  164.         $datastr .= $name;
  165.         $datastr .= $zdata;
  166.         $datastr .= pack('V', $crc);                 // crc32
  167.         $datastr .= pack('V', $c_len);               // compressed filesize
  168.         $datastr .= pack('V', $unc_len);             // uncompressed filesize

  169.    fwrite($this->fp,$datastr); //写入新的文件内容
  170.    $my_datastr_len = strlen($datastr);
  171.    unset($datastr);
  172.   
  173.    //新添文件目录信息
  174.         $dirstr = "\x50\x4b\x01\x02";
  175.         $dirstr .= "\x00\x00";                // version made by
  176.         $dirstr .= "\x14\x00";                // version needed to extract
  177.         $dirstr .= "\x00\x00";                // gen purpose bit flag
  178.         $dirstr .= "\x08\x00";                // compression method
  179.         $dirstr .= $hexdtime;                 // last mod time & date
  180.         $dirstr .= pack('V', $crc);           // crc32
  181.         $dirstr .= pack('V', $c_len);         // compressed filesize
  182.         $dirstr .= pack('V', $unc_len);       // uncompressed filesize
  183.         $dirstr .= pack('v', strlen($name) ); // length of filename
  184.         $dirstr .= pack('v', 0 );             // extra field length
  185.         $dirstr .= pack('v', 0 );             // file comment length
  186.         $dirstr .= pack('v', 0 );             // disk number start
  187.         $dirstr .= pack('v', 0 );             // internal file attributes
  188.         $dirstr .= pack('V', 32 );            // external file attributes - 'archive' bit set
  189.         $dirstr .= pack('V',$this->datastr_len ); // relative offset of local header
  190.         $dirstr .= $name;
  191.   
  192.    $this->dirstr .= $dirstr; //目录信息
  193.   
  194.    $this -> file_count ++;
  195.    $this -> dirstr_len += strlen($dirstr);
  196.    $this -> datastr_len += $my_datastr_len;
  197.     }
  198. function adddir($name){
  199.    $name = str_replace("\", "/", $name);
  200.    $datastr = "\x50\x4b\x03\x04\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00";
  201.   
  202.    $datastr .= pack("V",0).pack("V",0).pack("V",0).pack("v", strlen($name) );
  203.    $datastr .= pack("v", 0 ).$name.pack("V", 0).pack("V", 0).pack("V", 0);
  204.    fwrite($this->fp,$datastr); //写入新的文件内容
  205.    $my_datastr_len = strlen($datastr);
  206.    unset($datastr);
  207.   
  208.    $dirstr = "\x50\x4b\x01\x02\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00";
  209.    $dirstr .= pack("V",0).pack("V",0).pack("V",0).pack("v", strlen($name) );
  210.    $dirstr .= pack("v", 0 ).pack("v", 0 ).pack("v", 0 ).pack("v", 0 );
  211.    $dirstr .= pack("V", 16 ).pack("V",$this->datastr_len).$name;
  212.   
  213.    $this->dirstr .= $dirstr; //目录信息
  214.    $this -> file_count ++;
  215.    $this -> dirstr_len += strlen($dirstr);
  216.    $this -> datastr_len += $my_datastr_len;
  217. }

  218. function createfile(){
  219.    //压缩包结束信息,包括文件总数,目录信息读取指针位置等信息
  220.    $endstr = "\x50\x4b\x05\x06\x00\x00\x00\x00" .
  221.       pack('v', $this -> file_count) .
  222.       pack('v', $this -> file_count) .
  223.       pack('V', $this -> dirstr_len) .
  224.       pack('V', $this -> datastr_len) .
  225.       "\x00\x00";
  226.    fwrite($this->fp,$this->dirstr.$endstr);
  227.    fclose($this->fp);
  228. }
  229. }

  230. if(!trim($_REQUEST[zipname])) $_REQUEST[zipname] = "faisunzip.zip"; else $_REQUEST[zipname] = trim($_REQUEST[zipname]);
  231. if(!strrchr(strtolower($_REQUEST[zipname]),'.')=='.zip') $_REQUEST[zipname] .= ".zip";
  232. $_REQUEST[todir] = str_replace('\\','/',trim($_REQUEST[todir]));
  233. if(!strrchr(strtolower($_REQUEST[todir]),'/')=='/') $_REQUEST[todir] .= "/";
  234. if($_REQUEST[todir]=="/") $_REQUEST[todir] = "./";
  235. function listfiles($dir="."){
  236.    global $faisunZIP;
  237.    $sub_file_num = 0;
  238.    if(is_file("$dir")){
  239.     if(realpath($faisunZIP ->gzfilename)!=realpath("$dir")){
  240.     $faisunZIP -> addfile(implode('',file("$dir")),"$dir");
  241.     return 1;
  242.     }
  243.     return 0;
  244.    }
  245.   
  246.    $handle=opendir("$dir");
  247.    while ($file = readdir($handle)) {
  248.      if($file=="."||$file=="..")continue;
  249.      if(is_dir("$dir/$file")){
  250.     $sub_file_num += listfiles("$dir/$file");
  251.      }
  252.      else {
  253.          if(realpath($faisunZIP ->gzfilename)!=realpath("$dir/$file")){
  254.         $faisunZIP -> addfile(implode('',file("$dir/$file")),"$dir/$file");
  255.      $sub_file_num ++;
  256.      }
  257.      }
  258.    }
  259.    closedir($handle);
  260.    if(!$sub_file_num) $faisunZIP -> addfile("","$dir/");
  261.    return $sub_file_num;
  262. }
  263. function num_bitunit($num){
  264.    $bitunit=array(' B',' KB',' MB',' GB');
  265.    for($key=0;$key<count($bitunit);$key++){
  266.    if($num>=pow(2,10*$key)-1){ //1023B 会显示为 1KB
  267.     $num_bitunit_str=(ceil($num/pow(2,10*$key)*100)/100)." $bitunit[$key]";
  268.    }
  269.    }
  270.    return $num_bitunit_str;
  271. }
  272. if(is_array($_REQUEST[dfile])){
  273.    $faisunZIP = new PHPzip;
  274.    if($faisunZIP -> startfile("$_REQUEST[todir]$_REQUEST[zipname]")){
  275.     echo "正在添加压缩文件...<br><br>";
  276.     $filenum = 0;
  277.     foreach($_REQUEST[dfile] as $file){
  278.      if(is_file($file)){
  279.       echo "文件: $file<br>";
  280.      }else{
  281.       echo "目录: $file<br>";
  282.      }
  283.      $filenum += listfiles($file);
  284.     }
  285.     $faisunZIP -> createfile();
  286.     echo "<br>压缩完成,共添加 $filenum 个文件.<br><a href='$_REQUEST[todir]$_REQUEST[zipname]'>$_REQUEST[todir]$_REQUEST[zipname] (".num_bitunit(filesize("$_REQUEST[todir]$_REQUEST[zipname]")).")</a>";
  287.    }else{
  288.     echo "$_REQUEST[todir]$_REQUEST[zipname] 不能写入,请检查路径或权限是否正确.<br>";
  289.    }
  290. }else{
  291.    echo "没有选择的文件或目录.<br>";
  292. }

  293. endif;
  294. ?>
  295. </form>
  296. </body>
  297. </html>

复制代码
在文件的头部 $password = "123456";的123456可以改成你的密码
把文件保存为.php的文件
全部评论0
回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|手机版|小黑屋|管理员之家 ( 苏ICP备2023053177号-2 )

GMT+8, 2024-12-28 11:34 , Processed in 0.159729 second(s), 22 queries .

Powered by Discuz! X3.5

Cpoyright © 2001-2024 Discuz! Team