效果圖:
復(fù)制代碼 代碼如下:
 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"> 
<title>網(wǎng)站程序備份</title> 
</head> 
<body> 
<form method="post" action=""> 
<?php 
error_reporting(E_ALL & ~E_NOTICE); 
ini_set('memory_limit', '2048M'); 
echo "選擇要壓縮的文件或目錄:<br>"; 
$fdir = opendir('./'); 
while($file=readdir($fdir)) 
{ 
if($file=='.'|| $file=='..') 
continue; 
echo "<input 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 type="text" value="" size="50"> 
<font color="red"> 
(文件類型用"|"隔開(kāi),默認(rèn)空則包含任意文件,例:如果需要打包php和jpg文件,則輸入"php|jpg") 
</font> 
<br> 
壓縮文件保存到目錄: 
<input type="text" value="__dwb2011__" size="15"> 
<font color="red"> 
(留空為本目錄,必須有寫入權(quán)限) 
</font> 
<br> 
壓縮文件名稱: 
<input type="text" value="dwb2011.zip" size="15"> 
<font color="red"> 
(.zip) 
</font> 
<br> 
<br> 
<input type="hidden" value="dozip"> 
<input type='button' value='反選'> 
<input type="submit" value=" 開(kāi)始?jí)嚎s "> 
<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 
error_reporting(E_ALL & ~E_NOTICE); 
set_time_limit(0); 
class PHPzip 
{ 
var $file_count = 0 ; 
var $datastr_len = 0; 
var $dirstr_len = 0; 
var $filedata = ''; //該變量只被類外部程序訪問(wèn) 
var $gzfilename; 
var $fp; 
var $dirstr=''; 
var $filefilters = array(); 
function SetFileFilter($filetype) 
{ 
$this->filefilters = explode('|',$filetype); 
} 
//返回文件的修改時(shí)間格式. 
//只為本類內(nèi)部函數(shù)調(diào)用. 
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); 
} 
//初始化文件,建立文件目錄, 
//并返回文件的寫入權(quán)限. 
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; 
} 
//添加一個(gè)文件到 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); 
//新添文件內(nèi)容格式化: 
$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); //寫入新的文件內(nèi)容 
$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("http://", "/", $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); //寫入新的文件內(nèi)容 
$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() 
{ 
//壓縮包結(jié)束信息,包括文件總數(shù),目錄信息讀取指針位置等信息 
$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"); 
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 會(huì)顯示為 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 個(gè)文件.<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] 不能寫入,請(qǐng)檢查路徑或權(quán)限是否正確.<br>"; 
} 
} 
?> 
</form> 
</body> 
</html> 
新聞熱點(diǎn)
疑難解答