因为大马只能下载一些单文件,无法下载文件夹里的文件,所以花费一些时间写了一个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】(原创)的更多相关文章

  1. VS2010制作网站自定义安装程序 转

    最近在把一个网站打包成安装程序,这方面的文章网上有很多,也看了不少,但因为开发环境的不同,遇到了一些问题,便写下这篇文章记下整个流程(有很多资源都来自互联网,由于条目颇多,所以无法说明其来处,敬请谅解 ...

  2. WebApp触屏版网站开发要点

    所谓的触屏版网站其实也是WebApp的一种展示形式,主要是依赖HTML+CSS+Javascript这三个关键因素来实现,相比较原生客户端程序来说优点就是开发周期短.升级简单.维护成本低,因为从根本上 ...

  3. 手机版WEB开发经验分享,手机版网站开发注意事项,网站自适应,手机版网站自适应,移动安卓APP自适应

    转自 http://my.oschina.net/cart/blog/282477 做前端开发不短了,用过jQuery Mobile jqMobi 也纯手工写过.. 最后总结如下: jQuery Mo ...

  4. WAP、触屏版网站及APP的区别

     1.电脑版网站: 电脑版网站是指用户通过台式或者笔记本电脑浏览器打开的网站,也就是我们平时上网所访问的网站.其支持和兼容IE6.IE7.IE8.IE9.IE10.Firefox.Chrome等各种主 ...

  5. 关于pyinstaller打包程序时设置icon时的一个坑

    关于pyinstaller打包程序时设置icon时的一个坑     之前在用pyinstaller打包程序的时候遇到了关于设置图标的一点小问题,无论在后面加--icon 或是-i都出现报错.查了下st ...

  6. chrome打包程序

      使用chrome如何打包扩展程序中已经存在的插件及所遇到的问题 CreateTime--2017年7月4日07:41:33 Author:Marydon 一.前言 鉴于本文章的访问量大,特此进行多 ...

  7. sphider 丁廷臣简体中文完美汉化版带蜘蛛搜索引擎程序 v1.3.4

    sphider 丁廷臣简体中文完美汉化版带蜘蛛搜索引擎程序 v1.3.4是最官方的新版,免费开源,用官方最新发布原版汉化.未更改任何内核文件. Sphider 是一个完美的带有蜘蛛的搜索引擎程序. S ...

  8. 图解使用VS的安装项目打包程序

    背景 这段时间一直在做客户端程序的打包程序,遇到各种坑.因为以前没有任何这方面的经验,历经各种折腾,费尽九牛二虎之力总算是完成了. 虽然没有太多技术含量,但是因为挺繁琐的,所以还是在此记录一下. 由于 ...

  9. [No00009D]使用visual studio 2015 update3打包程序安装包的简单方法(不需要InstallShield)

    注意: 该方法只适用于小型软件的打包发布: 该打包向导可以预先检查需要的运行库支持: 由于visual studio自2012后取消掉了自带的打包程序,如果有需要打包安装,需要使用一个叫用Instal ...

随机推荐

  1. string中的erase()函数

    erase()是对string类型的字符串进行删除元素操作的函数 1.erase(int index) 删除下标从index开始直到字符串结尾的元素 1 string s = "123215 ...

  2. java8中常用的新功能

    Lambda表达式的用法,并行流.Optional.循环.线程池等

  3. LeetCode 94. 二叉树的中序遍历(Binary Tree Inorder Traversal)

    94. 二叉树的中序遍历 94. Binary Tree Inorder Traversal 题目描述 给定一个二叉树,返回它的 中序 遍历. LeetCode94. Binary Tree Inor ...

  4. Django源码分析之启动wsgi发生的事

    前言 ​ 好多人对技术的理解都停留在懂得使用即可,因而只会用而不会灵活用,俗话说好奇害死猫,不然我也不会在凌晨1.48的时候决定写这篇博客,好吧不啰嗦了 ​ 继续上一篇文章,后我有个问题(上文:&qu ...

  5. [转帖]JVM—深入理解内存模型与垃圾收集机制

    JVM—深入理解内存模型与垃圾收集机制 https://juejin.im/post/5d68dc9ee51d4561ad6548f7 前言 Java是一种跨平台的语言,当初其设计初衷也是为了解决各个 ...

  6. QT 创建一个线程播放监控视频

    1.创建一个线程类(PlayVideoThread): PlayVideoThread.h头文件 #pragma once #include <QObject> #include &quo ...

  7. wx.request 请求

    wx.request 1.wx.request相当于ajax请求,和django后台进行交互 官方文档:https://developers.weixin.qq.com/miniprogram/dev ...

  8. 查看php和apache配置成功的方法

    PHP配置文件是php.ini  检查php是否配置成功,在wamp/www根目录写一个phpinfo.php文件,内容为 <?php phpinfo(); ?>  然后可以打开网页输入l ...

  9. CCF 2017-03-1 分蛋糕

    CCF 2017-03-1 分蛋糕 题目 问题描述 小明今天生日,他有n块蛋糕要分给朋友们吃,这n块蛋糕(编号为1到n)的重量分别为a1, a2, -, an.小明想分给每个朋友至少重量为k的蛋糕.小 ...

  10. Hadoop Local(本地)模式搭建

    1. 下载压缩包 2. 配置环境变量 3. 配置Hadoop的JAVA_HOME路径 4. WordCount 1. 下载压缩包 下载Hadoop binary二进制压缩包 https://hadoo ...