PHP:阅读文件夹的无休止循环?
我想知道如何解决以下问题: 我正在读取服务器上的一个文件夹,并显示如下内容。如果有图像,我将打印图像,如果有文件夹,我将打印带有文件夹图标的div。我想知道是否可以单击其中一个子文件夹,然后以与当前显示父文件夹内容完全相同的方式显示此文件夹的内容。如果文件夹中有文件夹,那么它应该是一种无止境的循环PHP:阅读文件夹的无休止循环?,php,file-io,Php,File Io,我想知道如何解决以下问题: 我正在读取服务器上的一个文件夹,并显示如下内容。如果有图像,我将打印图像,如果有文件夹,我将打印带有文件夹图标的div。我想知道是否可以单击其中一个子文件夹,然后以与当前显示父文件夹内容完全相同的方式显示此文件夹的内容。如果文件夹中有文件夹,那么它应该是一种无止境的循环 $path = 'files'; if (($retval = scandir($path)) !== false) { $retval = array_filter($retval, 'f
$path = 'files';
if (($retval = scandir($path)) !== false) {
$retval = array_filter($retval, 'filter_files');
shuffle($retval);
}
function filter_files($file) {
return ($file != '.' && $file != '..' && $file != '.DS_Store' && $file != 'Thumbs.db');
}
//loop through shuffled files
foreach ($retval as $value) {
$ext = pathinfo($value, PATHINFO_EXTENSION); //file extension
if ($ext == "jpg" || $ext == "jpeg" || $ext == "gif" || $ext == "png") {
print "<img class='thumb' src='$path/$value'/>";
} else if ($ext == "") { //must be a folder
print "<div class='thumb folder'><a href=''>link_to_subfolder</a></div>";
} else {
//not supported
}
}
$path='files';
if(($retval=scandir($path))!==false){
$retval=array_filter($retval,'filter_files');
洗牌($retval);
}
函数过滤器\u文件($file){
返回($file!='.&&$file!='..'&&&$file!='.DS_Store'&&&$file!='Thumbs.db');
}
//循环浏览无序文件
foreach($retval为$value){
$ext=pathinfo($value,pathinfo_扩展名);//文件扩展名
如果($ext==“jpg”| |$ext==“jpeg”| |$ext==“gif”| |$ext==“png”){
打印“”;
}else if($ext==“”){//必须是文件夹
打印“”;
}否则{
//不支持
}
}
这可能吗 您可能希望有一个AJAXified页面,如果用户单击某个文件夹,它会向服务器发送一个AJAX请求,获取该文件夹的内容并显示它们。这将使PHP更简单,但您必须为页面编写一些JavaScript
此外,您可能需要研究使用
is_dir()
来确定某个内容是否为目录。测试是否有文件扩展名并非万无一失(文件不必有扩展名)。对于文件夹,请在链接中输入GET参数:
echo '<a href="myfile.php?dir=' . $value .'">foo</a>';
echo';
然后在脚本中,阅读$\u GET['dir']
变量以了解要使用的文件夹。您可以将此变量粘贴到$path
请注意,您必须记住,如果您允许任何人使用脚本,他们将能够通过更改
dir
参数打开任何文件夹。例如,如果他们通过。/../../../../../etc
,他们可以访问服务器passwd文件。在有链接的文件夹上为文件夹路径设置get变量,然后如果该路径存在,则为其设置加载路径:
print "<div class='thumb folder'><a href='yourfile.php?path=".$value."'>link_to_subfolder</a></div>";
这个例子是<强>非常/强>基本,您需要考虑用户是否可以查看他们正在请求的文件夹。例如,如果我知道您刚刚使用了上面的代码,我可以输入默认密码目录的文件夹路径并查看文件。您需要添加一些验证以进行检查。
在不详细讨论递归的情况下,这里有一个小的编辑,它可以做您想要的事情,类似于您想要的事情(假设您的代码工作正常)$base='files';
函数过滤器\u文件($file){
返回($file!='.&&$file!='..'&&&$file!='.DS_Store'&&&$file!='Thumbs.db');
}
函数show_目录($path){
if(($retval=scandir($path))!==false){
$retval=array_filter($retval,'filter_files');
洗牌($retval);
}
//循环浏览无序文件
foreach($retval为$value){
$ext=pathinfo($value,pathinfo_扩展名);//文件扩展名
如果($ext==“jpg”| |$ext==“jpeg”| |$ext==“gif”| |$ext==“png”){
打印“”;
}else if(is_dir($path.'/'.$value)){/*是*文件夹
打印“”;
显示目录($path.'/'.$value);
打印“”;
}否则{
//不支持
}
}
}
显示目录($base);
一些参考资料:
编辑:我想我看错了这个问题,虽然这对OP来说仍然是有用的信息,但我确信,所以我现在就把它放在这里。我还没有检查你的代码,但它有效吗?它有什么作用吗?请给我们一点时间工作……是的,它工作得很好。我只是不知道如果我点击一个子文件夹,我怎么能运行相同的页面。太棒了,谢谢。我可以阻止它在地址栏中显示/index.php吗?path=name\u of_folder并将其更改为/name\u of_folder…这将是有史以来最酷的事情。我想这是不可能的,因为你需要重写,是吗?你可以。。。如果你知道你的应用程序只有文件路径作为url,你可以简单地检查域之后的任何内容,并将其作为get'path'参数发送。如果您知道将有其他页面提供服务,那么您必须添加前缀,例如“/files/path to looked”,然后发送该前缀。你最好就此开始一个新问题
if(isset($_GET['path'])) $path = $_GET['path'];
else $path = 'files';
$base = 'files';
function filter_files($file) {
return ($file != '.' && $file != '..' && $file != '.DS_Store' && $file != 'Thumbs.db');
}
function show_directory($path) {
if (($retval = scandir($path)) !== false) {
$retval = array_filter($retval, 'filter_files');
shuffle($retval);
}
//loop through shuffled files
foreach ($retval as $value) {
$ext = pathinfo($value, PATHINFO_EXTENSION); //file extension
if ($ext == "jpg" || $ext == "jpeg" || $ext == "gif" || $ext == "png") {
print "<img class='thumb' src='$path/$value'/>";
} else if (is_dir($path . '/' . $value)) { // *is* a folder
print "<div class='thumb folder'><a href=''>link_to_subfolder</a>";
show_directory($path . '/' . $value);
print "</div>";
} else {
//not supported
}
}
}
show_directory($base);