2014년 5월 3일 토요일

PHP 로 파일 검색 기능 구현

가끔 서버내의 파일 목록을 조회 해 올 필요가 있다.
내 경우는 운영중의 나스 내에 파일이 정확히 업로드 되어 있는지 확인 하는 경우 사용한다.

물론 나스가 기본적으로 제공하는 파일 탐색기를 사용해도 되겠으나, 무겁기도 하거니와 파일 검색 기능은 제대로 동작하지 않는 경우가 많다.

일반적으로 판매중인 나스들이 PHP 를 지원하므로 PHP 로 간단히 특정 파일을 검색 하여 파일 목록을 조회하는 기능을 만들면 편리하다.

참고한 원본 :
http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=qna_function&wr_id=186648


<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no,target-densitydpi=medium-dpi"/>

<?
 $s01 = $_REQUEST['s01'];//검색파일이름 지정
 $s02 = $_REQUEST['s02'];//검색파일이름 지정
?>

<form  action="_FileList.php" method="post">
<table>
<tr >
  <td>
   <input  type="text" name="s01" size="18" value="<?=$s01?>" />
   <input  type="text" name="s02" size="18" value="<?=$s02?>" />
  </td>
</tr>
<tr>
  <td>
   <input type="submit" value="검색" />
  </td>
</tr>
</table>

<?
$path = "./"; //검색할 폴더 지정


function get_files($path, $s01="") 
{
 $invalid_char = array("\\", "*", "+", "/", "\"", "?", "\|");

 global $s01, $s02;
 $s01 = $_REQUEST['s01'];//검색파일이름 지정
 $s02 = $_REQUEST['s02'];//검색파일이름 지정

 if (strlen($s01) <= 2) {
  echo '검색 문자열이 너무 짧습니다. (01)<br>';
  exit; 
 }

 if (strlen($s01) >= 30) {
  echo '검색 문자열이 너무 깁니다. (01)<br>';
  exit; 
 }

 if (strlen($s02) > 0) {
  if (strlen($s02) < 2) {
   echo '검색 문자열이 너무 짧습니다. (02)<br>';
   exit; 
  }

  if (strlen($s02) >= 30) {
   echo '검색 문자열이 너무 깁니다. (02)<br>';
   exit; 
  }
 }


    static $list = array(); 
 // invalid_char에 해당 하는 검색어는 잘못된 파일 형식이므로 무시함.
 $s01 = str_replace($invalid_char, "", $s01);
 $s02 = str_replace($invalid_char, "", $s02);

 // 패턴 검사를 위해 test(0)[1].gif 등의 형식을 \( \[의 형식으로 변환함. 
 $escape = array("("=>"\\(", 
      ")"=>"\\)", 
      "["=>"\\[", 
      "]"=>"\\]" 
    );

    $dh = opendir($path); 
    while ( ($read=readdir($dh))!==false ) 
    { 
  if($read[0] == '.' || $read[0] == '..' ) continue; 
  
  if ( is_dir($path.$read.'/') ) get_files($path.$read.'/'); 
  else {

   // 대소문자 구분없이 파일명에 검색어가 있는지 비교함
   if(eregi(str_replace(array_keys($escape), array_values($escape), $s01), $read))
   {
     if (strlen($s02) > 0)
     {
      if(eregi(str_replace(array_keys($escape), array_values($escape), $s02), $read))
      {
       $ext = strtolower(substr($read, (strrpos($read, '.') + 1 )));
       $read = iconv('euckr', 'utf-8', $read);
       $list[] = $read . " : " . filesize($path.$read) ;
      }
     }
     else
     {
      $ext = strtolower(substr($read, (strrpos($read, '.') + 1 )));
      $read = iconv('euckr', 'utf-8', $read);
      $list[] = $read . " : " . filesize($path.$read) ;
     }
   }
  }
    } 
    closedir($dh); 
    return $list; 
} 

$list = get_files($path);
sort($list); 
?>

<?=$s01?>, <?=$s02?>로 검색하여 총 <?=count($list)?>개를 찾았습니다.<br>

<?
 echo "<table border='1'>";
 foreach ($list as $value)
 {
  $temp = explode(':',$value); // |로 나누기 

  echo "<tr><td width='300'>$temp[0]</td><td width='100' align='right'>$temp[1]</td></tr>";
 }
 echo "</table>";
?>