1. 程式人生 > >php版網站站打包程序【配合webshell】(原創)

php版網站站打包程序【配合webshell】(原創)

在線 arr bst 文件類型 ava checked length extra 分享圖片

因為大馬只能下載一些單文件,無法下載文件夾裏的文件,所以花費一些時間寫了一個PHP腳本,打包全站數據,在此分享!切勿做違法事情!

使用方法:

1、將該程序上傳到網站的目錄下,如/zip.php ;

2、在瀏覽器中訪問程序 http://www.xuetong365.com/zip.php ;

3、將出現上圖所示界面,可按照提示說明進行相關的操作;

4、點擊壓縮,稍等片刻(根據網站數據量的大小等待的時間不同),即可壓縮完成;

5、壓縮完成後會顯示壓縮文件的下載地址,可選擇在線下載也可以使用FTP進行下載;

技術分享圖片

代碼:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>PHP整站打包程序</title>
</head>
<body>
<form name="myform" method="post" action="">
  <?php
ini_set(‘memory_limit‘, ‘2048M‘);
echo "選擇要壓縮的文件或目錄:<br>";
$fdir = opendir(‘./‘);
while ($file = readdir($fdir)) {
    if ($file == ‘.‘ || $file == ‘..‘)
        continue;
    echo "<input name=‘dfile[]‘ type=‘checkbox‘ value=‘$file‘ " . ($file == basename(__FILE__) ? "" : "checked") . "> ";
     
    if (is_file($file)) {
        echo "<font face=\"wingdings\" size=\"5\">2</font>  $file<br>";
    } else {
        echo "<font face=\"wingdings\" size=\"5\">0</font> $file<br>";
    }
}
?>
  <br>
  包含下列文件類型:
  <input name="file_type" type="text" id="file_type" value=""
    size="50">
  <font color="red"> (文件類型用"|"隔開,默認空則包含任意文件,例:如果需要打包php和jpg文件,則輸入"php|jpg") </font> <br>
  壓縮文件保存到目錄:
  <input name="todir" type="text" id="todir" value="__dodo__"
    size="15">
  <font color="red"> (留空為本目錄,必須有寫入權限) </font> <br>
  壓縮文件名稱:
  <input name="zipname" type="text" id="zipname" value="dodo.zip"
    size="15">
  <font color="red"> (.zip) </font> <br>
  <br>
  <input name="myaction" type="hidden" id="myaction" value="dozip">
  <input
    type=‘button‘ value=‘反選‘ onclick=‘selrev();‘>
  <input type="submit"
    name="Submit" value=" 開始壓縮 ">
  <script language=‘javascript‘>
 function selrev()
 {
  with(document.myform)
  {
   for(i=0;i<elements.length;i++)
   {
    thiselm = elements[i];
    if(thiselm.name.match(/dfile\[]/))
     thiselm.checked = !thiselm.checked;
   }
  }
 }
</script>
  <?php
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 = ‘‘;
    var $filefilters = array();
     
    function SetFileFilter($filetype)
    {
        $this->filefilters = explode(‘|‘, $filetype);
    }
     
    //返回文件的修改時間格式.
    //只為本類內部函數調用.
    function unix2DosTime($unixtime = 0)
    {
        $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
        if ($timearray[‘year‘] < 1980) {
            $timearray[‘year‘]    = 1980;
            $timearray[‘mon‘]     = 1;
            $timearray[‘mday‘]    = 1;
            $timearray[‘hours‘]   = 0;
            $timearray[‘minutes‘] = 0;
            $timearray[‘seconds‘] = 0;
        }
        return (($timearray[‘year‘] - 1980) << 25) | ($timearray[‘mon‘] << 21) | ($timearray[‘mday‘] << 16) | ($timearray[‘hours‘] << 11) | ($timearray[‘minutes‘] << 5) | ($timearray[‘seconds‘] >> 1);
    }
     
    //初始化文件,建立文件目錄,
    //並返回文件的寫入權限.
    function startfile($path = ‘dodo.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);
        if (!empty($this->filefilters)) {
            if (!in_array(end(explode(".", $name)), $this->filefilters)) {
                return;
            }
        }
        $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] = "dodozip.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 $dodozip; //全局
    $sub_file_num = 0;
    if (is_file("$dir")) {
        if (realpath($dodozip->gzfilename) != realpath("$dir")) {
            $dodozip->addfile(implode(‘‘, file("$dir")), "$dir"); //將文件讀取出來,寫個$dir命名文件夾
            return 1;
        }
        return 0;
    }
     
    $handle = opendir("$dir");
    while ($file = readdir($handle)) //打開句柄.
        {
        if ($file == "." || $file == "..")
            continue;
         
        if (is_dir("$dir/$file")) {
            $sub_file_num += listfiles("$dir/$file"); //遞歸讀取
        } else {
            if (realpath($dodozip->gzfilename) != realpath("$dir/$file")) {
                $dodozip->addfile(implode(‘‘, file("$dir/$file")), "$dir/$file");
                $sub_file_num++;
            }
        }
    }
     
    closedir($handle);
     
    if (!$sub_file_num)
        $dodozip->addfile("", "$dir/");
     
    return $sub_file_num;
}
 
function num_bitunit($num)
{
    $bitunit = array(
        ‘ B‘,
        ‘ KB‘,
        ‘ MB‘,
        ‘ GB‘
    );
    for ($key = 0; $key < count($bitunit); $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])) {
    $dodozip = new PHPzip;
    if ($_REQUEST["file_type"] != NULL)
        $dodozip->SetFileFilter($_REQUEST["file_type"]);
    if ($dodozip->startfile("$_REQUEST[todir]$_REQUEST[zipname]")) {
        echo "正在添加壓縮文件...<br><br>";
        $filenum = 0;
        foreach ($_REQUEST[dfile] as $file) {
            if (is_file($file)) {
                if (!empty($dodozip->filefilters))
                    if (!in_array(end(explode(".", $file)), $dodozip->filefilters))
                        continue;
                echo "<font face=\"wingdings\" size=\"5\">2</font>  $file<br>";
            } else {
                echo "<font face=\"wingdings\" size=\"5\">0</font> $file<br>";
            }
            $filenum += listfiles($file); //讀取目錄.
        }
        $dodozip->createfile();
         
        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>";
    } else {
        echo "$_REQUEST[todir]$_REQUEST[zipname] 不能寫入,請檢查路徑或權限是否正確.<br>";
    }
}
?>
</form>
<hr color="#003388">
</body>
</html>

  

php版網站站打包程序【配合webshell】(原創)