2013-07-04 8 views
0

이 스크립트는 내 서버에서 특정 문자열로 시작하는 파일을 검색 한 다음 다운로드 링크를 반환합니다. 검색 쿼리는 "f"GET 값으로 정의됩니다. 이제PHP 파일 검색 문제 - 파일의 전체 경로를 반환하지 않음

의 내가 내 서버에서 다음 파일을 가정 해 봅시다 :

/폴더/예제 파일 번호 /폴더 one.zip/예제 파일 번호 /폴더/예를 들어 파일 번호 세 two.zip .zip

"example file"을 검색하면 스크립트는 3 개의 결과를 반환하지만 모든 다운로드 링크는 전체 파일 이름 (/ 폴더/예제 파일 번호 XXX) 대신 "/ 폴더/예제 파일"이됩니다. 지퍼).

이것은 또한 파일 크기는() "/ 폴더/예제 파일"의 크기를 찾습니다 이후, 스크립트의 끝 부분에있는 파일 크기() 함수를 사용하여 버그를 만드는 대신에 전체 파일 이름

를 사용합니다 그 문제를 해결하도록 도와 주시겠습니까?

$request = $_GET['f']; 
$adr = $_SERVER['QUERY_STRING']; 
$decode = rawurldecode(substr($adr, 2)); 

echo "Searching for $decode"; 

// finding the file on the server 
$root = $_SERVER['DOCUMENT_ROOT']; 
$search = preg_quote(utf8_decode($decode)); 

function rsearch($folder, $pattern) { 
    $dir = new RecursiveDirectoryIterator($folder); 
    $ite = new RecursiveIteratorIterator($dir); 
    $files = new RegexIterator($ite, $pattern, RegexIterator::GET_MATCH); 
    $fileList = array(); 
    foreach ($files as $file) { 
     $fileList = array_merge($fileList, $file); 
    } 
    return $fileList; 
} 
$resultatss = rsearch($root, '/.*\/'.$search.'/'); 

foreach ($resultatss as $resultat) { 
    $downloadlink = str_replace("$root/", "", $resultat); 
    $pos = strrpos($downloadlink, '/') + 1; 
    $encodedownloadlink = substr($downloadlink, 0, $pos) . rawurlencode(substr($downloadlink, $pos)); 

    if (!empty($downloadlink)) { 
     echo "download link = http://www.mydomain.com/$encodedownloadlink"; 
     $taillekb = filesize($downloadlink)/1024; 
     echo "<br>Size: $taillekb KB<br>"; 
    } else { 
     echo "File not found"; 
    } 

} 

답변

0

나는 RecursiveDirectoryIterator 기능에 익숙하지 않았기 때문에이를 확인하기로했습니다. 깔끔한 것들!

$path = $_SERVER['DOCUMENT_ROOT']; 
$search = rawurldecode($_GET['f']); 

$it = new RecursiveDirectoryIterator($path); 
foreach (new RecursiveIteratorIterator($it) as $file){ 
    $pathfile = str_replace($path,'',$file); 
    if (strpos($pathfile, $search) !== false) { 
     echo 'file = '. basename($file) .'<br>'; 
     echo 'link = http://www.mydomain.com'. $pathfile .'<br>'; 
     echo 'size = '. round(filesize($file)/1024,2) .' KB<br><br>'; 
    } 
} 

당신이 찾을 것입니다 스크립트 search.php 이름을 가정 ... http://www.mydomain.com/search.php?f=whatever를 통해 실행 ...

방법 # 1 : 나는 당신이 원하는 것을 할 것 같다, 다음을 썼다 단어 whatever을 포함하는 모든 파일. ...이 부분

function rsearch($path, $search) { 
    $files = array(); 
    $it = new RecursiveDirectoryIterator($path); 
    foreach (new RecursiveIteratorIterator($it) as $file){ 
     if (strpos($file, $search) !== false) $files[] = $file; 
    } 
    return $files; 
} 

$path = $_SERVER['DOCUMENT_ROOT']; 
$search = rawurldecode($_GET['f']); 

$files = rsearch($path, $search); 

foreach ($files as $file) { 
    $pathfile = str_replace($path,'',$file); 
    if (strpos($pathfile, $search) !== false) { 
     echo 'file = '. basename($file) .'<br>'; 
     echo 'link = http://www.mydomain.com'. $pathfile .'<br>'; 
     echo 'size = '. round(filesize($file)/1024,2) .' KB<br><br>'; 
    } 
} 
+0

같은 문제 :

방법 # 2 ...

당신은 (함수에서 검색을 가하고)이 떨어져 분할 할 경우, 여기에 보이는 방법 스크립트의 URL에있는 폴더를 제거하고 파일 이름 만 유지하면됩니다. 코드로 변경하면 스크립트는 파일 이름 앞에 폴더 이름을 반환하지만 처음 단어 만 검색하면 불완전한 파일 이름을 얻게됩니다. –

+0

흠 ..'rsearch()'함수에 익숙하지 않습니다. 뭐하는거야? – neokio

+0

내 게시물을 확인, 나는 기능의 코드를 게시했습니다. 모든 폴더와 하위 폴더에서 문자열을 검색 한 다음 발견 된 파일의 목록을 반환하는 RecursiveDirectoryIterator입니다. 문제는 파일 이름이 불완전하고, 스크립트가 파일을 찾을 때 검색 쿼리를 반환한다는 것입니다. –

관련 문제