这是一个棘手的问题,我不知道从哪里开始,所以任何帮助都会感激不尽。
我有一个名为'source'的父文件夹(c:/ dev / source),其中包含多个子文件夹。
我需要一个PHP脚本,它将显示每个子文件夹旁边的复选框,以及一个新文件夹名称的文本字段,允许用户勾选他们想要复制到'c目的地的复选框:的/ dev /目的地/ the_folder_name_they_typed_in
当他们点击提交时,所选子文件夹将从c:/ dev / source复制到c:/ dev / destination / the_folder_name_they_typed_in
这一切都在本地内部开发服务器上运行。子文件夹将始终位于c:/ dev / source /
中答案 0 :(得分:1)
Somme建议:
使用白名单表示目标文件夹中允许的字符。仅在匹配时提交操作:
^[a-z0-9_-]+$
您可以将数组索引用于目录名称。通过这种方式,您可以使用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]"/>
始终检查上面列出的白名单目录名称。 (如果您允许使用.
或/
或其他许多字符,则可能存在安全风险。)
答案 1 :(得分:0)
这是一个名为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-&gt; getSubPath()替换它,然后在复制它时将“c:/ dev / source”添加到变量$ c?