2012-08-13 75 views
0

我试图列出存储在成员的唯一文件夹内的所有子目录中的文件集。PHP回声文件列表 - 列出多个子目录中的联邦文件

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

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); 
    } 
+0

你的代码的一些要点:你不检查,如果上传实际上已成功;你相信用户不会对文件类型撒谎;并且您使用的时间戳粒度为1秒粒度作为文件名,如果两个文件在同一时间戳完成上传,则不会提供冲突;并使用你的path_info正确地获取原始文件的扩展名,然后立即将它扔掉,以获得效率非常低的爆炸/结束操作集。 – 2012-08-13 17:40:33

+0

@ MarcB谢谢你的批评没有建议。 +1教育学生。 – Craig 2012-08-13 18:08:28

回答

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>'; 

编辑:更新的代码,包括反馈

+0

当我尝试实现您的建议时,它会尝试打开文件本身作为目录,并为每个包含的文件吐出一个错误。 – Craig 2012-08-13 18:10:00

+0

下面是我所做的扩展你写的东西,但是当我回显$ list的时候,它不会打印任何东西。 '$ id = $ _SESSION ['id']; \t $ udir =“members /".$ id。”/“; ($ dir = opendir($ udir)){ \t while(false!==($ file = readdir($ dir))){\t \t \t if($ file!=“。”&& $ file!= “.. ”){ \t \t \t如果(is_dir($文件)===真){ \t \t \t \t $ DIR =执行opendir(“ $文件”); \t \t \t \t $ file = readdir($ dir); \t \t \t \t $ list。='

  • '.$file.'
  • '; \t \t \t \t closedir($ file); \t \t \t \t} \t \t \t否则,如果(is_file($文件)===真){ \t \t \t $名单= '
  • '.$file.'
  • '。 \t \t \t} \t \t} \t} \t closedir($ DIR); }' – Craig 2012-08-13 19:07:07

    +0

    我刚刚创建了一个小页面来测试脚本。你是对的,它没有工作。我为此更新了代码,现在它正在工作,但是链接在我的环境中不起作用,因为我无法加载本地文件...但我想我可以将细节留给您。 – StrubT 2012-08-13 19:52:24

    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");