php打包程序

来源:互联网 发布:手机投资理财软件 编辑:程序博客网 时间:2024/04/29 17:32
[php] view plaincopy
  1. <html>    
  2. <head>    
  3. <meta http-equiv="Content-Type" content="text/html; charset=gb2312">    
  4. <title>PHP整站打包程序-By DoDo</title>  
  5. </head>    
  6. <body>    
  7. <form name="myform" method="post" action="">  
  8.   
  9. <?php     
  10.     ini_set('memory_limit''2048M');  
  11.     echo "选择要压缩的文件或目录:<br>";    
  12.     $fdir = opendir('./');    
  13.     while($file=readdir($fdir))  
  14.     {    
  15.         if($file=='.'|| $file=='..')   
  16.         continue;    
  17.         echo "<input name='dfile[]' type='checkbox' value='$file' ".($file==basename(__FILE__)?"":"checked")."> ";    
  18.       
  19.         if(is_file($file))  
  20.         {    
  21.             echo "<font face=\"wingdings\" size=\"5\">2</font>  $file<br>";    
  22.         }  
  23.         else  
  24.         {    
  25.             echo "<font face=\"wingdings\" size=\"5\">0</font> $file<br>";    
  26.         }    
  27.     }    
  28. ?>    
  29.   
  30. <br>  
  31. 包含下列文件类型:  
  32. <input name="file_type" type="text" id="file_type" value="" size="50">    
  33. <font color="red">  
  34. (文件类型用"|"隔开,默认空则包含任意文件,例:如果需要打包php和jpg文件,则输入"php|jpg")  
  35. </font>  
  36. <br>  
  37. 压缩文件保存到目录:    
  38. <input name="todir" type="text" id="todir" value="__dodo__" size="15">    
  39. <font color="red">  
  40. (留空为本目录,必须有写入权限)  
  41. </font>  
  42. <br>    
  43. 压缩文件名称:    
  44. <input name="zipname" type="text" id="zipname" value="dodo.zip" size="15">    
  45. <font color="red">  
  46. (.zip)  
  47. </font>  
  48. <br>    
  49. <br>  
  50. <input name="myaction" type="hidden" id="myaction" value="dozip">    
  51. <input type='button' value='反选' onclick='selrev();'>    
  52. <input type="submit" name="Submit" value=" 开始压缩 ">    
  53. <script language='javascript'>    
  54.     function selrev()   
  55.     {    
  56.         with(document.myform)   
  57.         {    
  58.             for(i=0;i<elements.length;i++)   
  59.             {    
  60.                 thiselm = elements[i];    
  61.                 if(thiselm.name.match(/dfile\[]/))   
  62.                     thiselm.checked = !thiselm.checked;    
  63.             }    
  64.         }    
  65.     }    
  66. </script>    
  67.   
  68. <?php    
  69. set_time_limit(0);    
  70. class PHPzip  
  71. {    
  72.     var $file_count = 0 ;    
  73.     var $datastr_len   = 0;    
  74.     var $dirstr_len = 0;    
  75.     var $filedata = ''//该变量只被类外部程序访问    
  76.     var $gzfilename;    
  77.     var $fp;    
  78.     var $dirstr='';    
  79.     var $filefilters = array();  
  80.   
  81.     function SetFileFilter($filetype)  
  82.     {  
  83.         $this->filefilters = explode('|',$filetype);  
  84.     }  
  85.       
  86.     //返回文件的修改时间格式.    
  87.     //只为本类内部函数调用.    
  88.     function unix2DosTime($unixtime = 0)   
  89.     {    
  90.         $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);    
  91.         if ($timearray['year'] < 1980)   
  92.         {    
  93.             $timearray['year']    = 1980;    
  94.             $timearray['mon']     = 1;    
  95.             $timearray['mday']    = 1;    
  96.             $timearray['hours']   = 0;    
  97.             $timearray['minutes'] = 0;    
  98.             $timearray['seconds'] = 0;    
  99.         }    
  100.         return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |  ($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);    
  101.     }    
  102.   
  103.     //初始化文件,建立文件目录,    
  104.     //并返回文件的写入权限.    
  105.     function startfile($path = 'dodo.zip')  
  106.     {    
  107.         $this->gzfilename=$path;    
  108.         $mypathdir=array();    
  109.   
  110.         do  
  111.         {    
  112.             $mypathdir[] = $path = dirname($path);    
  113.         }   while($path != '.');    
  114.   
  115.         @end($mypathdir);    
  116.   
  117.         do  
  118.         {    
  119.             $path = @current($mypathdir);    
  120.             @mkdir($path);    
  121.         }   while(@prev($mypathdir));    
  122.   
  123.         if($this->fp=@fopen($this->gzfilename,"w"))  
  124.         {    
  125.             return true;    
  126.         }    
  127.   
  128.         return false;    
  129.     }    
  130.   
  131.     //添加一个文件到 zip 压缩包中.    
  132.     function addfile($data$name)  
  133.     {    
  134.         $name = str_replace('\\', '/', $name);   
  135.         if(strrchr($name,'/')=='/')   
  136.             return $this->adddir($name);  
  137.         if(!emptyempty($this->filefilters))  
  138.         {  
  139.             if (!in_array(end(explode(".",$name)), $this->filefilters))  
  140.             {  
  141.                 return;  
  142.             }  
  143.         }  
  144.         $dtime = dechex($this->unix2DosTime());   
  145.         $hexdtime = '\x' . $dtime[6] . $dtime[7] . '\x' . $dtime[4] . $dtime[5] . '\x' . $dtime[2] . $dtime[3] . '\x' . $dtime[0] . $dtime[1];   
  146.         eval('$hexdtime = "' . $hexdtime . '";');   
  147.   
  148.         $unc_len = strlen($data);   
  149.         $crc     = crc32($data);   
  150.         $zdata   = gzcompress($data);   
  151.         $c_len   = strlen($zdata);   
  152.         $zdata   = substr(substr($zdata, 0, strlen($zdata) - 4), 2);   
  153.   
  154.         //新添文件内容格式化:   
  155.         $datastr  = "\x50\x4b\x03\x04";   
  156.         $datastr .= "\x14\x00";            // ver needed to extract   
  157.         $datastr .= "\x00\x00";            // gen purpose bit flag   
  158.         $datastr .= "\x08\x00";            // compression method   
  159.         $datastr .= $hexdtime;             // last mod time and date   
  160.         $datastr .= pack('V'$crc);             // crc32   
  161.         $datastr .= pack('V'$c_len);           // compressed filesize   
  162.         $datastr .= pack('V'$unc_len);         // uncompressed filesize   
  163.         $datastr .= pack('v'strlen($name));    // length of filename   
  164.         $datastr .= pack('v', 0);                // extra field length   
  165.         $datastr .= $name;   
  166.         $datastr .= $zdata;   
  167.         $datastr .= pack('V'$crc);                 // crc32   
  168.         $datastr .= pack('V'$c_len);               // compressed filesize   
  169.         $datastr .= pack('V'$unc_len);             // uncompressed filesize   
  170.         fwrite($this->fp,$datastr); //写入新的文件内容   
  171.         $my_datastr_len = strlen($datastr);   
  172.         unset($datastr);   
  173.   
  174.         //新添文件目录信息   
  175.         $dirstr  = "\x50\x4b\x01\x02";   
  176.         $dirstr .= "\x00\x00";                 // version made by   
  177.         $dirstr .= "\x14\x00";                 // version needed to extract   
  178.         $dirstr .= "\x00\x00";                 // gen purpose bit flag   
  179.         $dirstr .= "\x08\x00";                 // compression method   
  180.         $dirstr .= $hexdtime;                  // last mod time & date   
  181.         $dirstr .= pack('V'$crc);            // crc32   
  182.         $dirstr .= pack('V'$c_len);          // compressed filesize   
  183.         $dirstr .= pack('V'$unc_len);        // uncompressed filesize   
  184.         $dirstr .= pack('v'strlen($name) );  // length of filename   
  185.         $dirstr .= pack('v', 0 );              // extra field length   
  186.         $dirstr .= pack('v', 0 );              // file comment length   
  187.         $dirstr .= pack('v', 0 );              // disk number start   
  188.         $dirstr .= pack('v', 0 );              // internal file attributes   
  189.         $dirstr .= pack('V', 32 );             // external file attributes - 'archive' bit set   
  190.         $dirstr .= pack('V',$this->datastr_len ); // relative offset of local header   
  191.         $dirstr .= $name;   
  192.         $this->dirstr .= $dirstr//目录信息   
  193.         $this -> file_count ++;   
  194.         $this -> dirstr_len += strlen($dirstr);   
  195.         $this -> datastr_len += $my_datastr_len;   
  196.     }   
  197.   
  198.     function adddir($name)  
  199.     {   
  200.         $name = str_replace("\\", "/", $name);   
  201.         $datastr = "\x50\x4b\x03\x04\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00";   
  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.         $dirstr = "\x50\x4b\x01\x02\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00";   
  208.         $dirstr .= pack("V",0).pack("V",0).pack("V",0).pack("v"strlen($name) );   
  209.         $dirstr .= pack("v", 0 ).pack("v", 0 ).pack("v", 0 ).pack("v", 0 );   
  210.         $dirstr .= pack("V", 16 ).pack("V",$this->datastr_len).$name;   
  211.         $this->dirstr .= $dirstr//目录信息   
  212.         $this -> file_count ++;   
  213.         $this -> dirstr_len += strlen($dirstr);   
  214.         $this -> datastr_len += $my_datastr_len;   
  215.     }   
  216.   
  217.     function createfile()  
  218.     {   
  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.   
  231. if(!trim($_REQUEST[zipname]))   
  232.     $_REQUEST[zipname] = "dodozip.zip";   
  233. else   
  234.     $_REQUEST[zipname] = trim($_REQUEST[zipname]);   
  235.   
  236. if(!strrchr(strtolower($_REQUEST[zipname]),'.')=='.zip')   
  237.     $_REQUEST[zipname] .= ".zip";   
  238.   
  239. $_REQUEST[todir] = str_replace('\\','/',trim($_REQUEST[todir]));   
  240.   
  241. if(!strrchr(strtolower($_REQUEST[todir]),'/')=='/')   
  242.     $_REQUEST[todir] .= "/";   
  243.   
  244. if($_REQUEST[todir]=="/")   
  245.     $_REQUEST[todir] = "./";   
  246.   
  247. function listfiles($dir=".")  
  248. {   
  249.     global $dodozip;   
  250.     $sub_file_num = 0;   
  251.     if(is_file("$dir"))  
  252.     {   
  253.         if(realpath($dodozip ->gzfilename)!=realpath("$dir"))  
  254.         {   
  255.             $dodozip -> addfile(implode('',file("$dir")),"$dir");   
  256.             return 1;   
  257.         }   
  258.         return 0;   
  259.     }   
  260.   
  261.     $handle=opendir("$dir");   
  262.     while ($file = readdir($handle))   
  263.     {   
  264.         if($file=="."||$file=="..")  
  265.             continue;   
  266.   
  267.         if(is_dir("$dir/$file"))  
  268.         {   
  269.             $sub_file_num += listfiles("$dir/$file");   
  270.         }   
  271.         else   
  272.         {   
  273.             if(realpath($dodozip ->gzfilename)!=realpath("$dir/$file"))  
  274.             {   
  275.                 $dodozip -> addfile(implode('',file("$dir/$file")),"$dir/$file");   
  276.                 $sub_file_num ++;   
  277.             }   
  278.         }   
  279.     }   
  280.   
  281.     closedir($handle);   
  282.   
  283.     if(!$sub_file_num)   
  284.         $dodozip -> addfile("","$dir/");   
  285.   
  286.     return $sub_file_num;   
  287. }   
  288.   
  289. function num_bitunit($num)  
  290. {   
  291.     $bitunit=array(' B',' KB',' MB',' GB');   
  292.     for($key=0;$key<count($bitunit);$key++)  
  293.     {   
  294.         if($num>=pow(2,10*$key)-1)  
  295.         { //1023B 会显示为 1KB   
  296.             $num_bitunit_str=(ceil($num/pow(2,10*$key)*100)/100)." $bitunit[$key]";   
  297.         }   
  298.     }   
  299.     return $num_bitunit_str;   
  300. }   
  301.   
  302. if(is_array($_REQUEST[dfile]))  
  303. {   
  304.     $dodozip = new PHPzip;   
  305.     if($_REQUEST["file_type"] != NULL)  
  306.         $dodozip -> SetFileFilter($_REQUEST["file_type"]);  
  307.     if($dodozip -> startfile("$_REQUEST[todir]$_REQUEST[zipname]"))  
  308.     {   
  309.         echo "正在添加压缩文件...<br><br>";   
  310.         $filenum = 0;   
  311.         foreach($_REQUEST[dfile] as $file)  
  312.         {   
  313.             if(is_file($file))  
  314.             {   
  315.                 if(!emptyempty($dodozip -> filefilters))  
  316.                     if (!in_array(end(explode(".",$file)), $dodozip -> filefilters))  
  317.                         continue;  
  318.                 echo "<font face=\"wingdings\" size=\"5\">2</font>  $file<br>";   
  319.             }  
  320.             else  
  321.             {   
  322.                 echo "<font face=\"wingdings\" size=\"5\">0</font> $file<br>";   
  323.             }   
  324.             $filenum += listfiles($file);   
  325.         }   
  326.         $dodozip -> createfile();   
  327.   
  328.         echo "<br>压缩完成,共添加 $filenum 个文件.<br><a href='$_REQUEST[todir]$_REQUEST[zipname]' _fcksavedurl='$_REQUEST[todir]$_REQUEST[zipname]'>$_REQUEST[todir]$_REQUEST[zipname] (".num_bitunit(filesize("$_REQUEST[todir]$_REQUEST[zipname]")).")</a>";   
  329.     }  
  330.     else  
  331.     {   
  332.         echo "$_REQUEST[todir]$_REQUEST[zipname] 不能写入,请检查路径或权限是否正确.<br>";   
  333.     }   
  334. }  
  335. ?>    
  336. </form>    
  337. <hr color="#003388">  
  338. <center>  
  339. <a href="http://www.sectop.com" target="_blank">DoDo's Blog</a>  
  340. </center>  
  341. </body>    
  342. </html>  
原创粉丝点击