单一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 相关文章推荐
php生成SessionID和图片校验码的思路和实现代码
Mar 10 PHP
PHP Undefined index报错的修复方法
Jul 17 PHP
深入php多态的实现详解
Jun 09 PHP
浅析Dos下运行php.exe,出现没有找到php_mbstring.dll 错误的解决方法
Jun 29 PHP
php读取mysql中文数据出现乱码的解决方法
Aug 16 PHP
Mac OS下配置PHP+MySql环境
Feb 25 PHP
php判断两个浮点数是否相等的方法
Mar 14 PHP
提高php编程效率技巧
Aug 13 PHP
php实现购物车功能(上)
Jul 23 PHP
CI框架入门之MVC简单示例
Nov 21 PHP
详解PHP字符串替换str_replace()函数四种用法
Oct 13 PHP
php数组函数array_push()、array_pop()及array_shift()简单用法示例
Jan 26 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
AJAX for PHP简单表数据查询实例
2007/01/02 PHP
php ci框架中加载css和js文件失败的原因及解决方法
2014/07/29 PHP
PHP实现微信小程序用户授权的工具类示例
2019/03/05 PHP
基于Web标准的UI组件 — 树状菜单(2)
2006/09/18 Javascript
用JavaScript获取网页中的js、css、Flash等文件
2006/12/20 Javascript
关于JavaScript的gzip静态压缩方法
2007/01/05 Javascript
javascript的函数
2007/01/31 Javascript
javascript 函数式编程
2007/08/16 Javascript
juqery 学习之三 选择器 层级 基本
2010/11/25 Javascript
JavaScript使用IEEE 标准进行二进制浮点运算产生莫名错误的解决方法
2011/05/28 Javascript
JavaScript中访问节点对象的方法有哪些如何使用
2013/09/24 Javascript
悬浮数字的实现案例
2014/02/19 Javascript
我的Node.js学习之路(二)NPM模块管理
2014/07/06 Javascript
js使用正则实现ReplaceAll全部替换的方法
2014/08/22 Javascript
纯javascript模仿微信打飞机小游戏
2015/08/20 Javascript
javascript 操作cookies详解及实例
2017/02/22 Javascript
Bootstrap按钮组简单实现代码
2017/03/06 Javascript
浅谈vue 单文件探索
2018/09/05 Javascript
js数组中去除重复值的几种方法
2020/08/03 Javascript
javascript实现点击产生随机图形
2021/01/25 Javascript
Node.js中的异步生成器与异步迭代详解
2021/01/31 Javascript
python使用htmllib分析网页内容的方法
2015/05/08 Python
在Python中使用zlib模块进行数据压缩的教程
2015/06/26 Python
python简单线程和协程学习心得(分享)
2017/06/14 Python
详谈python3 numpy-loadtxt的编码问题
2018/04/29 Python
Python3中的json模块使用详解
2018/05/05 Python
Python 中导入csv数据的三种方法
2018/11/01 Python
Python设计模式之备忘录模式原理与用法详解
2019/01/15 Python
记录Python脚本的运行日志的方法
2019/06/05 Python
对YOLOv3模型调用时候的python接口详解
2019/08/26 Python
Django中的DateTimeField和DateField实现
2021/02/24 Python
CSS3动画animation实现云彩向左滚动
2014/05/09 HTML / CSS
10分钟入门CSS3 Animation
2018/12/25 HTML / CSS
YOOX美国官方网站:全球著名的多品牌时尚网络概念店
2016/09/11 全球购物
普通党员四风问题对照检查材料
2014/09/27 职场文书
财务会计求职信范文
2015/03/20 职场文书