单一index.php实现PHP任意层级文件夹遍历(Zjmainstay原创)


Posted in PHP onJuly 31, 2012

以下是核心文件:
index.php文件

<?php 
header('Content-Type:text/html charset:utf-8'); 
date_default_timezone_set('PRC'); 
$rootDir = 'listFile'; //站点根目录,装载本程序所有文件 
//站点base_url设置方法: 
//考虑到通用性,现默认使用方法二,修改方法时注意同时修改.htaccess文件 
//方法一:设置站点目录为根目录 
//对应.htaccess: 
//#RewriteBase / 
// $base_url = 'http://www.listfile.com/'; 
//方法二:设置站点子目录为根目录 
//对应.htaccess: 
//RewriteBase /listFile/ 
$base_url = 'http://www.test.com/' .$rootDir .'/'; 
//解析文件夹路径 
if(empty($_GET['return'])){ 
$dir = '.'; 
}else { 
$dir = trim(array_pop(explode($rootDir,$_GET['return'])),'/'); 
if(empty($dir)) $dir = '.'; 
else $dir = './' . $dir; 
} 
// echo $dir; //当前文件夹 
//遍历当前文件夹 
$pattern = '*'; // '*'搜索全部文件,可以智能匹配,如*.jpg 搜索jpg文件,*.{jpg,png}搜索jpg和png文件,区分大小写!! 
$skip = '*.skip'; //排除.skip类型文件(对应了“被跳过输出文件.skip”),你可以自己修改,如*.php排除所有php文件 
$files = scandir_through($dir,$pattern,$skip,false); 
?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<title>List Files</title> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<meta http-equiv="Content-Language" content="zh-CN" /> 
<script type="text/javascript" src="<?php echo $base_url . 'jquery-1.6.2.min.js' ?>"></script> 
<script type="text/javascript" src="<?php echo $base_url . 'main.js' ?>"></script> 
<link rel="stylesheet" rev="stylesheet" href="<?php echo $base_url . 'base.css' ?>" type="text/css" /> 
</head> 
<body> 
<script type="text/javascript"> 
var base_url = '<?php echo $base_url ?>'; 
//链接携带return标志,若携带,则autoClickUrl自添加一层下级文件夹用于跳转,跳转后获得美化后的URL。 
var autoClickUrl = '<?php echo (strpos($_SERVER['REQUEST_URI'],'?return') !== false)?array_shift(explode('?',$_SERVER['REQUEST_URI']))."baddir/":'';?>'; 
</script> 
<?php 
//文件类型数组 
$filetypes = array( 
'txt' => 'txt文本文件', 
'dir' => '文件夹', 
'php' => 'php文件', 
'css' => 'css文件', 
'js' => 'js文件', 
'doc' => 'Word文档', 
'xls' => 'Excel工作表', 
'jpg' => 'jpg图片文件', 
'gif' => 'gif图片文件', 
'png' => 'png图片文件', 
'mp3' => 'mp3文件', 
'zip' => 'zip压缩包', 
'rar' => 'rar压缩包', 
'htm' => 'htm网页文件', 
'html' => 'html网页文件', 
'undefined'=>'文件类型未知', 
); 
//自定义屏蔽输出文件 
$skipfiles = array( 
'index.php', 
'index.html', 
'jquery-1.6.2.min.js', 
'main.js', 
'base.css', 
); 
//按规律输出当前文件夹所有文件 
echo "<div id='back'><a href=''><img src='{$base_url}images/dir.jpg'/>..</a></div>"; 
echo "<div id='container'>"; 
echo "<div class='file text-center'><div class='filename border-right'>名称</div><div class='filesize border-right'>大小</div>"; 
echo "<div class='filetype border-right'>类型</div><div class='filemtime'>修改日期</div></div>"; 
foreach($files['filename'] as $index => $file){ 
if(in_array($file,$skipfiles)) continue; 
if(is_null($filetypes[$files['ext'][$index]])) $filetype = '文件类型未知'; 
else $filetype = $filetypes[$files['ext'][$index]]; 
echo "<div class='file'><div class='filename'><img src='{$base_url}images/{$files['ext'][$index]}.jpg'/><a href='{$base_url}{$files['widthDir'][$index]}'>{$file}</a></div>"; 
echo "<div class='filesize text-right'>{$files['filesize'][$index]} </div><div class='filetype text-right'>{$filetype}</div>"; 
echo "<div class='filemtime text-center'>{$files['filemtime'][$index]}</div></div>"; 
} 
echo '</div>'; 
?> 
</body> 
</html> 
<?php 
//文件夹遍历函数 
function scandir_through($dir,$pattern='*',$skip=false,$subInclude=true,$flag=GLOB_BRACE){ 
$files = array(); 
//获取当前目录下所有文件及文件夹 
$items = glob($dir . '/*'); 
//遍历所有项目,若设置$subInclude为true,则继续遍历子目录 
for ($i = 0; $i < count($items); $i++) { 
if ($subInclude && is_dir($items[$i])) { 
$add = glob($items[$i] . '/*'); 
if($add === false) $add = array(); 
$items = array_merge($items, $add); 
}else { 
$slash = strrpos($items[$i],'/'); 
$dir = substr($items[$i],0,$slash); 
//若当前文件匹配文件查找模式$pattern,则加入$files数组中 
if(in_array($items[$i],glob($dir.'/'.$pattern,$flag)) && (($skip===false) || !in_array($items[$i],glob($dir.'/'.$skip,$flag)))) { 
$files['filemtime'][] = date('Y-m-d H:i:s',filemtime($items[$i])); //放这里为了解决iconv后中文名文件获取时间失败问题 
$items[$i] = iconv('gb2312','utf-8',$items[$i]); 
$file = substr($items[$i],$slash+1); 
$files['widthDir'][] = $items[$i]; 
$files['filename'][] = $file; 
if(is_dir($items[$i])) { 
$files['ext'][] = 'dir'; 
$files['filesize'][] = ''; 
}else { 
$files['filesize'][] = ceil(filesize($file)/1024).'KB'; 
if(strrpos($file,'.') === false) $files['ext'][] = 'undefined'; 
else $files['ext'][] = strtolower(array_pop(explode('.',$file))); 
} 
} 
} 
} 
return $files; 
} 
/* 
//.htaccess 文件,位于根目录下,原理:访问路径非文件,即文件夹,因此跳转至根路径下做解析。 
RewriteEngine on 
#一级目录法 
#RewriteBase / 
#二级目录法 
RewriteBase /listFile/ 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule (.*) index.php?return=%{REQUEST_FILENAME} [L] 
*/ 
?>

JS文件
$(document).ready(function(){ 
//根节点删除返回链接 
if(window.location.href == base_url) $("#back").hide(); 
//返回处理 
$("#back a").click(function(){ 
if(autoClickUrl != ''){ 
//Add baddir for click back. 
var url = autoClickUrl; 
}else{ 
var url=window.location.href; 
} 
if(url == base_url) return false; //如果在根节点触发返回链接,直接返回。 
url = url.replace(location.search,''); //如果链接携带?return,截除return后续内容(由.htaccess生成) 
url = url.substr(0,url.length-2); // 从url后第2位开始,避免/#情况存在时跳转错误 
url = url.substr(0,url.lastIndexOf('/')+1); //截除最后一层文件夹,后退一级 
window.location.href = url; 
return false; //处理完毕,返回false阻止<a>标签点击后的跳转。 
}); 
if(autoClickUrl != '') $("#back a").click() 
});

CSS文件
#container{ 
border: 1px solid; 
margin: 0 auto; 
padding: 10px; 
width: 654px; 
border-radius: 10px 10px 10px 10px; 
} 
#back{ 
width: 654px; 
margin: 0 auto; 
} 
#back a{ 
line-style:none; 
} 
.file{ 
clear: both; 
height: 2px; 
margin-bottom: 20px; 
} 
.file img{ 
float:left; 
} 
.file a{ 
float:left; 
margin-left: 5px; 
} 
.file div{ 
float:left; 
width:150px; 
} 
.text-left{ 
text-align:left; 
} 
.text-center{ 
text-align:center; 
} 
.text-right{ 
text-align:right; 
} 
.border-left{ 
border-left:1px solid; 
} 
.border-right{ 
border-right:1px solid; 
} 
.file div.filename{ 
width:200px; 
} 
.file div.filesize{ 
width:100px; 
} 
.file div.filemtime{ 
width:200px; 
}

.htaccess文件
#原理:访问路径非文件,即文件夹,因此跳转至根路径下做解析获取当前目录下的所有文件并列出。 
RewriteEngine on 
#一级目录法 
#RewriteBase / 
#二级目录法 
RewriteBase /listFile/ 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule (.*) index.php?return=%{REQUEST_FILENAME} [L]

核心文件夹:listFile/images/
效果图如下:
//listFile

单一index.php实现PHP任意层级文件夹遍历(Zjmainstay原创)
软件包下载:下载

PHP 相关文章推荐
FCKeditor添加自定义按钮
Mar 27 PHP
php入门教程 精简版
Dec 13 PHP
关于二级目录拖拽排序的实现(源码示例下载)
Apr 26 PHP
PHP5常用函数列表(分享)
Jun 07 PHP
php实现邮件发送并带有附件
Jan 24 PHP
php跨站攻击实例分析
Oct 28 PHP
PHP 接入支付宝即时到账功能
Sep 18 PHP
PHP7扩展开发之hello word实现方法详解
Jan 15 PHP
原生JS实现Ajax通过GET方式与PHP进行交互操作示例
May 12 PHP
PHP 实现手机端APP支付宝支付功能
Jun 07 PHP
Laravel 连接(Join)示例
Oct 16 PHP
PHP设计模式(三)建造者模式Builder实例详解【创建型】
May 02 PHP
php读取txt文件组成SQL并插入数据库的代码(原创自Zjmainstay)
Jul 31 #PHP
php切割页面div内容的实现代码分享
Jul 31 #PHP
php中数组首字符过滤功能代码
Jul 31 #PHP
PHP常用开发函数解析之数组篇[未完结]
Jul 30 #PHP
php中拷贝构造函数、赋值运算符重载
Jul 25 #PHP
Erlang的运算符(比较运算符,数值运算符,移位运算符,逻辑运算符)
Jul 23 #PHP
php 调试利器debug_print_backtrace()
Jul 23 #PHP
You might like
php基础知识:类与对象(2) 自动加载对象
2006/12/13 PHP
PHP查询数据库中满足条件的记录条数(两种实现方法)
2013/01/29 PHP
PHP内核探索:哈希表碰撞攻击原理
2015/07/31 PHP
PHP Cli 模式设置进程名称的方法
2019/06/12 PHP
建议大家看下JavaScript重要知识更新
2007/07/08 Javascript
css图片自适应大小
2007/11/28 Javascript
Javascript常考语句107条收集
2010/03/09 Javascript
Javascript 类与静态类的实现(续)
2010/04/02 Javascript
window.open的页面如何刷新(父页面)上层页面
2012/12/28 Javascript
关于JS中的闭包浅谈
2013/08/23 Javascript
js的匿名函数使用介绍
2013/12/11 Javascript
js数组依据下标删除元素
2015/04/14 Javascript
详解Node.js中的事件机制
2016/09/22 Javascript
vue中引用swiper轮播插件的教程详解
2018/08/16 Javascript
react用Redux中央仓库实现一个todolist
2019/09/29 Javascript
JS脚本实现定时到网站上签到/签退功能
2020/04/22 Javascript
微信小程序实现导航栏和内容上下联动功能代码
2020/06/29 Javascript
[04:10]2016国际邀请赛中国区预选赛第二日TOP10精彩集锦
2016/06/28 DOTA
[59:15]EG vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.26
2018/08/29 DOTA
Python实现的简单算术游戏实例
2015/05/26 Python
基于Python数据可视化利器Matplotlib,绘图入门篇,Pyplot详解
2017/10/13 Python
django自带调试服务器的使用详解
2019/08/29 Python
Tensorflow实现在训练好的模型上进行测试
2020/01/20 Python
基于Python实现视频的人脸融合功能
2020/06/12 Python
北美Newegg打造的全球尖货海购平台:tt海购
2018/09/28 全球购物
日本化妆品植村秀俄罗斯官方网站:Shu Uemura俄罗斯
2020/02/01 全球购物
项目合作意向书范本
2014/04/01 职场文书
学习雷锋月活动总结
2014/07/03 职场文书
合作经营协议书范本
2014/09/16 职场文书
幼儿园教研工作总结2015
2015/05/12 职场文书
礼仪培训心得体会
2016/01/22 职场文书
2016年优秀共青团员事迹材料
2016/02/25 职场文书
幽默口才训练经典句子(48句)
2019/08/19 职场文书
Android开发实现极为简单的QQ登录页面
2022/04/24 Java/Android
CSS 左边固定宽右边自适应的6种方法
2022/05/15 HTML / CSS
delete in子查询不走索引问题分析
2022/07/07 MySQL