2010-09-01 118 views
0

我已經構建了一個系統,用戶可以啓動一個項目並將文件上傳到這個項目。當他們創建項目時,我會爲該項目專門創建一個目錄,並且所有上傳都會填充該目錄。但是,我已經實現了一個系統,允許用戶如果願意刪除此項目,刪除目錄中的所有文件,然後刪除目錄本身。PHP遍歷和刪除目錄問題

本地(在MAMP),這工作的魅力;然而,在現場服務器上卻沒有。對於目錄刪除,我使用了教程網站上的一段代碼(如下所示),正如我所說的,在本地Web服務器上工作良好。

$name = $_POST['projectName']; 
rrmdir("../../project/$name"); 

    function rrmdir($dir) { 
    if (is_dir($dir)) { 
     $objects = scandir($dir); 
     foreach ($objects as $object) { 
      if ($object != "." && $object != "..") { 
       if (filetype($dir."/".$object) == "dir") rrmdir($dir."/".$object); else unlink($dir."/".$object); 
      } 
     } 
     reset($objects); 
     rmdir($dir); 
     echo "Directory Removed"; 
    } 
+0

您是否通過CHMOD在文件夾上設置了適當的權限? – 2010-09-01 09:03:46

+0

會是777嗎?我認爲是這樣,但腳本在函數調用後似乎停止了。在rrmdir這行下面(...)我有幾個回聲,他們根本沒有發射。 – 2010-09-01 09:12:02

回答

2

試試這個來代替:

$iterator = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator('/path/to/project/directory'), 
    RecursiveIteratorIterator::CHILD_FIRST); 

foreach($iterator as $fileObject) { 
    if($fileObject->isFile()) { 
     echo 'Removing File: ', $fileObject->getRealpath(), PHP_EOL; 
     // unlink($fileObject->getRealpath()); 
    } elseif($fileObject->isDir()) { 
     echo 'Removing Dir: ', $fileObject->getRealpath(), PHP_EOL; 
     // rmdir($fileObject->getRealpath()); 
    } 
} 

取消對rmdirunlink線實際執行清除。

3

非常小心一點:

$name = $_POST['projectName']; 
rrmdir("../../project/$name"); 

這有點像SQL注入你的服務器的文件系統,想象一下,如果有人類型這在他們的瀏覽器:http://www.yoursite.com/this-script.php?projectName=../../../../var/www你可能會想看看escapeshellarg()以幫助關閉這個大的安全漏洞,並將realpath()轉換爲絕對路徑。如果目標目錄不爲空,那麼rmdir將不起作用,在rmdir工作之前,您需要首先刪除所有的子目錄和文件。

+0

感謝您的支持,但帖子來自他們項目的下拉列表,此字段不可編輯。非常感謝 – 2010-09-01 10:59:21

+0

表單只是實際POST數據的GUI。這個POST數據很容易被僞造,或者可以被攔截,並與像Tamper Data(https://addons.mozilla.org/en-US/firefox/addon/966/)這樣的插件重疊。這裏有一個很好的應用/網絡安全教學: http://google-gruyere.appspot.com/ – 2010-09-02 00:37:25