欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

php 打包网站在线压缩为zip

程序员文章站 2022-06-05 19:48:23
...
  1. ?//在URL后参加 ?pwd=密码 查看生成密码
  2. $password = '8baa717e6265d1c1d762cc896151f821'; //l23
  3. ?>
  4. php ZIP压缩程序
  5. 在线压缩ZIP文件程序


  6. 使用方法:选定要压缩的文件或目录(包含子目录),即可开始压缩。压缩的结果保留原来的目录结构。

  7. echo '当前目录:'. dirname(__FILE__) . ' 退出';
  8. else
  9. if(isset($_GET['pwd']) )
  10. echo '密码值:'. md5($_GET['pwd']) . '';
  11. else
  12. echo 'Tips:在URL后参加?pwd=密码 查看生成密码.';
  13. ?>
  • if(!isset($_REQUEST["myaction"])):
  • ?>
  • 验证密码:
  • elseif($_REQUEST["myaction"]=="dolist"):
  • if(!isset($_REQUEST['pwd']) || empty($_REQUEST['pwd']) )
  • die('请输入密码! Again');
  • if(md5($_REQUEST['pwd']) != $password)
  • die('输入的密码不正确!Again');
  • echo '选择要排除的目录(相对路径,以英文半角逗号分隔):
    ';
  • echo '
    ';
  • echo "选择要压缩的文件或目录:
    ";
  • $fdir = opendir('./');
  • while($file=readdir($fdir)){
  • if($file=='.'|| $file=='..' ) continue;
  • echo " ";
  • if(is_file($file)){
  • echo "文件: $file
    ";
  • }else{
  • echo "目录: $file
    ";
  • }
  • }
  • ?>

  • 压缩文件保存到目录:
  • (留空为本目录,必须有写入权限)
  • 压缩文件名称:
  • (.zip)

  • 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'] $timearray['year'] = 1980;
  • $timearray['mon'] = 1;
  • $timearray['mday'] = 1;
  • $timearray['hours'] = 0;
  • $timearray['minutes'] = 0;
  • $timearray['seconds'] = 0;
  • }
  • return (($timearray['year'] - 1980) ($timearray['hours'] > 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 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 "正在添加压缩文件...

    ";
  • $filenum = 0;
  • foreach($_REQUEST['dfile'] as $file){
  • if(is_file($file)){
  • echo "文件: $file
    ";
  • }else{
  • echo "目录: $file
    ";
  • }
  • $filenum += listfiles($file);
  • }
  • $faisunZIP -> createfile();
  • echo "
    压缩完成,共添加 $filenum 个文件.
    ". $_REQUEST['todir'].$_REQUEST['zipname']." (".num_bitunit(filesize("$_REQUEST[todir]$_REQUEST[zipname]")).")";
  • }else{
  • echo $_REQUEST['todir'].$_REQUEST['zipname'].'不能写入,请检查路径或权限是否正确.
    ';
  • }
  • }else{
  • echo "没有选择的文件或目录.
    ";
  • }
  • endif;
  • ?>
  • TOP

  • 复制代码


  • php, zip