PHP网站备份程序代码分享


Posted in PHP onJune 10, 2011

效果图:
PHP网站备份程序代码分享
PHP代码

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"> 
<title>网站程序备份</title> 
</head> 
<body> 
<form name="myform" 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 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="__dwb2011__" size="15"> 
<font color="red"> 
(留空为本目录,必须有写入权限) 
</font> 
<br> 
压缩文件名称: 
<input name="zipname" type="text" id="zipname" value="dwb2011.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 
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 = ''; //该变量只被类外部程序访问 
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"); 
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> 
</body> 
</html>
PHP 相关文章推荐
PHP与MySQL交互使用详解
Oct 09 PHP
php中使用ExcelFileParser处理excel获得数据(可作批量导入到数据库使用)
Aug 21 PHP
xml在joomla表单中的应用详解分享
Jul 19 PHP
php中防止恶意刷新页面的代码小结
Oct 31 PHP
关于二级目录拖拽排序的实现(源码示例下载)
Apr 26 PHP
Zend Framework框架路由机制代码分析
Mar 22 PHP
利用php生成验证码
Feb 23 PHP
php 截取GBK文档某个位置开始的n个字符方法
Mar 08 PHP
PHP实现找出有序数组中绝对值最小的数算法分析
Aug 07 PHP
PHP实现生成模糊图片的方法示例
Dec 21 PHP
php异常处理捕获错误整理
Sep 23 PHP
PHP实现计算器小功能
Aug 28 PHP
php在页面中调用fckeditor编辑器的方法
Jun 10 #PHP
PHP中遍历stdclass object的实现代码
Jun 09 #PHP
IIS7.X配置PHP运行环境小结
Jun 09 #PHP
php基础学习之变量的使用
Jun 09 #PHP
php学习之数据类型之间的转换介绍
Jun 09 #PHP
php学习之运算符相关概念
Jun 09 #PHP
php学习之流程控制实现代码
Jun 09 #PHP
You might like
UPUPW 更新 64 位 Apache 系列 PHP 7.0 正式版
2015/12/08 PHP
PHP环形链表实现方法示例
2017/09/15 PHP
js hover 定时器(实例代码)
2013/11/12 Javascript
JQuery中操作Css样式的方法
2014/02/12 Javascript
javascript复制粘贴与clipboardData的使用
2014/10/16 Javascript
JavaScript资源预加载组件和滑屏组件的使用推荐
2016/03/10 Javascript
Bootstrap中的Panel和Table全面解析
2016/06/13 Javascript
浅谈javascript运算符——条件,逗号,赋值,()和void运算符
2016/07/15 Javascript
AngularJS ng-template寄宿方式用法分析
2016/11/07 Javascript
jQuery控制控件文本的长度的操作方法
2016/12/05 Javascript
JS批量替换内容中关键词为超链接
2017/02/20 Javascript
深入理解Vue nextTick 机制
2018/04/28 Javascript
解决vue动态为数据添加新属性遇到的问题
2018/09/18 Javascript
Vue.js特性Scoped Slots的浅析
2019/02/20 Javascript
npm 语义版本控制详解
2019/09/10 Javascript
Vue 中获取当前时间并实时刷新的实现代码
2020/05/12 Javascript
vue项目打包后提交到git上为什么没有dist这个文件的解决方法
2020/09/16 Javascript
vant中的toast层级改变操作
2020/11/04 Javascript
Python图片转换成矩阵,矩阵数据转换成图片的实例
2018/07/02 Python
在python中安装basemap的教程
2018/09/20 Python
python学生管理系统开发
2019/01/30 Python
python 随机生成10位数密码的实现代码
2019/06/27 Python
python 字符串的驻留机制及优缺点
2020/06/19 Python
python输入中文的实例方法
2020/09/14 Python
美国真皮手袋品牌:GiGi New York
2017/03/10 全球购物
Lookfantastic希腊官网:英国知名美妆购物网站
2018/09/15 全球购物
中国专业的音频分享平台:喜马拉雅
2019/05/24 全球购物
数据库的约束含义
2012/09/09 面试题
小学教师的个人自我鉴定
2013/10/26 职场文书
硕士研究生自我鉴定
2013/11/08 职场文书
2014年大学生村官工作总结
2014/11/19 职场文书
2015新教师教学工作总结
2015/07/22 职场文书
2015年信息技术教研组工作总结
2015/07/22 职场文书
2019新员工试用期转正工作总结范文
2019/08/21 职场文书
Python list去重且保持原顺序不变的方法
2021/04/03 Python
centos8安装MongoDB的详细过程
2021/10/24 MongoDB