2011-03-24 159 views
1

這是一個棘手的問題,我不知道從哪裏開始,所以任何幫助都會很感激。PHP將選定的文件從A文件夾移動到B文件夾

我有一個名爲「源」(c:/ dev/source)的父文件夾,其中包含多個子文件夾。

我需要一個PHP腳本,它將顯示每個旁邊有複選框的子文件夾,以及一個新文件夾名稱的文本字段,允許用戶勾選他們想複製到'c的目的地的複選框是:/ dev /目的/ the_folder_name_they_typed_in

當他們點擊提交,所選的子文件夾將被從C複製是:/ dev /源到c:/開發/目的地/ the_folder_name_they_typed_in

這是在本地所有正在運行內部開發服務器。子文件夾將始終位於c:/ dev/source/

+0

從[php'rename()'](http://php.net/manual/en/function.rename.php)函數開始。 – sarnold 2011-03-24 10:58:49

回答

1

下面是一個不爲人知的小代碼,名爲DirectoryIterator。它沒有完整的記錄在PHP網站上,但繼承人的精神:

創建一個文件和文件夾旁邊的複選框列表,把它們全部放在一個數組中。

$Directory = new RecursiveDirectoryIterator('c:/dev/source'); 
$Iterator = new RecursiveIteratorIterator($Directory);  

?><form method="post"><? 
foreach($Iterator as $r){ 

     if($r->isDot()) continue; 

     echo "<input type=\"checkbox\" name=\"copy[]\" value=\"".($r->getSubPathName())."\"> ".$r->getSubPathName() . " <br>"; 

} 
?></form><? 

現在這部分添加到該文件

<?php 
if($_POST){ 
if(is_array($_POST['copy'])) foreach($_POST['copy'] as $c){ 
@copy($c, str_replace('c:/dev/source','c:/dev/dest', $c)); 
    echo "copied: $c to ". str_replace('c:/dev/source','c:/dev/dest', $c) . "<br>"; 

} 
} 

頂我不完全知道是什麼導致你$r->getSubPathName()讓你可以讓我知道,如果輸出數組?如果是這樣的話,你可能會用$ r-> getSubPath()替換它,然後在複製它時將「c:/ dev/source」添加到變量$ c中?

延伸閱讀:

here

+0

謝謝傑森。它拋出一個錯誤: 致命錯誤:調用未定義的方法SplFileInfo :: isDot() – PHPnoob 2011-03-24 21:43:38

+0

您運行@PHPnoob的PHP版本是什麼? – Jason 2011-03-25 03:26:34

1

索姆建議:

使用在目標文件夾中允許的字符白名單。只有當它匹配提交操作:

^[a-z0-9_-]+$ 

您可以使用數組索引爲目錄名。這樣,您就可以通了ckeckboxes與foreach ($_POST["dirs"]) { ... }

<input type="checkbox" name="dirs[directory_name]"/> 
<input type="checkbox" name="dirs[other_dir_name]"/> 
<input type="checkbox" name="dirs[third_directory_name]"/> 

始終checkthe目錄名稱重複對一個白名單像上面。 (如果您允許字符./或許多其他可能是安全風險)。

相關問題