PHP Echo文件列表 - 列出来自多个子目录的列表

时间:2012-08-13 17:03:44

标签: php html list file-upload recursion

我正在尝试列出存储在成员唯一文件夹中所有子目录中的文件集。

在这里,您可以看到保存文件的样式:

    date_default_timezone_set('EST');
    $id = $_SESSION['id'];
    $udir = "members/".$id."/";
    $date = date("Y.m.d");
    $curdir = $udir.$date."/";
    $datetime = date("Y.m.d.G.i.s");
    $fname = $_FILES["file"]["name"];
    $extn = pathinfo($fname, PATHINFO_EXTENSION);
    if(!is_dir($curdir)){
        mkdir($udir.$date, 0700);
    }
    $ufile = $curdir.$datetime.".".$extn;
    $allexts = array("jpg", "jpeg", "gif", "png");
    $ext = end(explode(".", $_FILES["file"]["name"]));
    if((($_FILES["file"]["type"] == "image/gif")
        || ($_FILES["file"]["type"] == "image/jpeg")
        || ($_FILES["file"]["type"] == "image/pjpeg")
        || ($_FILES["file"]["type"] == "image/png"))
        && ($_FILES["file"]["size"] < 2000000)
        && in_array($ext, $allexts)){
        if (move_uploaded_file($_FILES['file']['tmp_name'], $ufile)) {
            echo "File upload was successful.";
        } else {
            echo "An error has occured. Please try again.";
        }
    }
    else{
        echo "Invalid file. Please try again.";
    }

现在,我正在尝试使用这些文件:

    $id = $_SESSION['id'];
    $udir = "members/".$id."/";
    if ($dir = opendir("$udir")) {
        while (false !== ($file = readdir($dir))) {
            if ($file != "." && $file != "..") {
                $list .= '<li><a href="'.$udir.$file.'">'.$file.'</a></li>';
            }
        }
        closedir($dir);
    }

正如您可能已经猜到的那样,只返回成员唯一ID文件夹中的子目录列表。因此,我继续使用递归函数,似乎挖掘了目录,但我无法弄清楚如何合并这两个。下面的代码返回所有文件的完整路径,但这就是我已经得到的。

    $path = realpath("$udir");
    $recur = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path));
    foreach($recur as $files => $recur){
    echo "$files";}

非常感谢合并这两个功能或完整备选方案的任何指导!

编辑:我继续尝试使用下面的建议,但是在调用$ list时我没有得到结果。这是修改后的代码。

    $id = $_SESSION['id'];
    $udir = "members/".$id."/";
    if ($dir = opendir($udir)) {
        while (false !== ($file = readdir($dir))) {
            if ($file != "." && $file != "..") {
                if (is_dir($file) === true){
                    $dir = opendir("$file");
                    $file = readdir($dir);
                    $list .= '<li><a href="'.$udir.$file.'">'.$file.'</a></li>';
                    closedir($file);
                }
                else if (is_file($file) === true){
                $list .= '<li><a href="'.$udir.$file.'">'.$file.'</a></li>';
                }
            }
        }
        closedir($dir);
    }

2 个答案:

答案 0 :(得分:0)

我真的不明白你的问题。为什么不直接将第二个块移动到一个函数并递归调用它?

function listDir($udir) {
    $list = '';
    if ($dir = opendir($udir)) {
        while (false !== ($file = readdir($dir))) {
            if ($file != '.' && $file != '..') {
                if (is_dir($udir.'\\'.$file) === true) {
                    $list .= listDir($udir.'\\'.$file);
                } else if (is_file($udir.'\\'.$file) === true) {
                    $list .= '<li><a href="'.$udir.'\\'.$file.'">'.$file.'</a></li>';
                }
            }
        }
        closedir($dir);
    }
    return $list;
}

echo '<ul>'.listDir('D:\<test>\<test>').'</ul>';

编辑更新代码以包含反馈

答案 1 :(得分:0)

也许这样

function getDirectory($path = '.', $level = 0)
{
    $ignore = array( 'cgi-bin', '.', '..' ); 
    $dh = @opendir( $path );      
    while( false !== ( $file = readdir( $dh ) ) )
    {      
        if( !in_array( $file, $ignore ) )
        {             
            $spaces = str_repeat( '&nbsp;', ( $level * 4 ) );
            if( is_dir( "$path/$file" ) )
            {             
                echo "<strong>$spaces $file</strong><br />"; 
                getDirectory( "$path/$file", ($level+1) );

            }
            else
            {             
                echo "$spaces $file<br />";            
            }
        } 
    } 
    closedir( $dh ); 
} 

getDirectory("/var");