2010-06-28 43 views
0

我想製作一個腳本,只列出文件夾內的文件夾。問題是我的用戶可以在他們的文件夾中創建文件夾,所以基本上我想要做的就是讓用戶管理他們的文件夾和存儲文件......我的問題是我想讓PHP「認爲「根文件夾是他們的主目錄,他們不能超過他們的主目錄。目前我的php函數不能這樣做,它只顯示目錄的內容......並且如果用戶升到一個層次並且再升一級......等等......他可以瀏覽整個硬盤駕駛。目錄列表與限制

function directoryList($path) { 
    $dirStruct = array(); 
    if(is_dir($path)) { 
     $handle = opendir($path); 
     while(($file = readdir($handle)) !== false) { 
      if(@opendir($path.$file)) { 
       chdir($path.$file); 
       $absolutepath = getcwd(); 
       $dirStruct[] = array('path' => $absolutepath.'\\', 'name'=>$file); 
      } 
     } 
    } 
    return $dirStruct; 
} 

回答

2

而不是給用戶一個絕對路徑,只允許它們指定相對於給定基路徑的路徑。接下來,編寫一個函數,刪除相對路徑的任何「/../」,並且您是安全的(只要用戶無法在服務器上創建鏈接...)。

如果你想要很好,你可以匹配「..」和之前的元素(所以「a /../ b」會變成「b」,即「..」刪除「a」 「)或者如果在它之前沒有路徑元素,則忽略」..「。

+0

我假設「a /../ b」是一個正則表達式。是嗎? – user253530 2010-06-28 16:07:15

+0

不,「..」是父目錄。 – 2010-06-29 07:09:36

0

這裏是一個小東西,以擴大:你的文件夾中傳遞你想從列出的目錄

function listFolders($folderPath, $homeFolder) 
{ 
    $folderPath = realpath($folderPath); 
    $homeFolder = realpath($homeFolder); 
    if(strpos($folderPath, $homeFolder) === 0) { 
     return glob("$folderPath/*", GLOB_ONLYDIR); 
    } 
} 

$dirs = listFolders('/home/gordon/code/php', '/home/gordon'); 
print_r($dirs); 

$folderPath。對於$homeFolder傳入您想成爲最頂層文件夾的文件夾。通過realpath這兩個路徑,你確保它們被解析爲絕對路徑。如果$folderPath低於$homeFolder,那麼$folderPath字符串將以字符串開始幷包含整個$homeFolder字符串。如果是這種情況,我們只需glob$folderPath中的所有目錄,並將它們的絕對路徑返回到數組中。


要從$homeFolder得到$folderPath的相對路徑,只是做

ltrim(str_replace('/home/gordon/', './', '/home/gordon/code/php/'), '/'); 

這將返回./code/php/


如果你想與OOP要做到這一點,你可能會感興趣的SPL DirectoryIterator