2012-08-13 4 views
0

구성원의 고유 폴더 내에있는 모든 하위 디렉터리에 저장된 파일 집합을 나열하려고합니다. 여기PHP 에코 파일 목록 - 여러 하위 디렉터리에서 Fed 목록 표시

당신이 파일이 저장되고있는 스타일을 어떻게 볼 수 있습니다

$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); 
    } 

을 당신으로 어떤 : 다음과 같이 이제

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 폴더에있는 하위 디렉토리 목록 만 반환합니다. 따라서 필자는 재귀 함수 (recursive function)를 사용하여 작업을 진행했는데, 이는 디렉토리를 파헤치는 것처럼 보였지만이 둘을 병합하는 방법을 알 수는 없습니다. 아래 코드는 모든 파일의 전체 경로를 반환하지만, 지금까지 내가 얻은 것입니다.

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

이 두 기능을 통합하거나 완전한 대안을 제시하는 것이 가장 좋습니다.

EDIT : 아래 제안을 활용 해 보았지만 $ 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를 사용하여 원본 파일 확장명을 올바르게 가져온 다음 즉시 비효율적 인 폭발/종료 작업 세트를 위해 멀리 던져 버리십시오. –

+0

@MarcB 제안없이 비판 해 주셔서 감사합니다. 학생 교육에 +1. – Craig

답변

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

+0

다음은 내가 작성한 내용의 확장으로 수행 한 작업이지만 $ list를 echo 할 때 아무 것도 출력하지 않습니다. '$ id = $ _SESSION [ 'id']; \t $ udir = "members /".$ id."/ "; 경우 ($ 말 일세 =했던 opendir ($ udir)) { \t 동안 (거짓! == ($ 파일 = readdir을 ($ dir을))) {\t \t \t 경우 ($ 파일! = "."&& $ 파일! = "..") { \t \t \t 경우는 true (is_dir ($ 파일) ===) { \t \t \t \t $ 해줄 =했던 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 '
  • '.$file.'
  • '= (참 is_file ($ 파일) ===) { \t \t \t $ 목록 경우.; \t \t \t \t \t }}} \t \t closedir ($의 DIR); }' – Craig

    +0

    방금 ​​스크립트를 테스트 할 작은 페이지를 만들었습니다. 당신 말이 맞아요. 작동하지 않았어요. 그 때문에 코드가 업데이트되었지만 현재 작동 중입니다. 그러나 로컬 파일을로드 할 수 없기 때문에 링크가 내 환경에서 작동하지 않습니다 ...하지만 세부 사항을 남겨 둘 수는 있습니다. – StrubT

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