Php 根据“选择”值显示和删除子文件夹中的文件
我的文件夹结构有4层,我的表单在顶层,目前它只在顶层显示文件,我希望能够选择一个子文件夹并显示其中的文件,以便在必要时删除它们Php 根据“选择”值显示和删除子文件夹中的文件,php,select,delete-file,subdirectory,chdir,Php,Select,Delete File,Subdirectory,Chdir,我的文件夹结构有4层,我的表单在顶层,目前它只在顶层显示文件,我希望能够选择一个子文件夹并显示其中的文件,以便在必要时删除它们 Produce Produce/Meat Produce/Meat/Beef Produce/Meat/Beef/Portions Produce/Meat/Beef/Packaged Produce/Vegtables Produce/Vegetables/Fresh Produce/Vegetables/Fresh/Local etc,. “我的表单”使用复选框显
Produce
Produce/Meat
Produce/Meat/Beef
Produce/Meat/Beef/Portions
Produce/Meat/Beef/Packaged
Produce/Vegtables
Produce/Vegetables/Fresh
Produce/Vegetables/Fresh/Local etc,.
“我的表单”使用复选框显示其所在文件夹的内容,然后我可以勾选框并删除文件,但我已添加了“选择”,并希望能够显示所选子文件夹的内容并删除文件。我制作了两个提交按钮,两个都可以,但是删除功能只有在顶部文件夹中才有效
if ($_POST['delete'] == 'Submit')
{
foreach ((array) $_POST['select'] as $file) {
if(file_exists($file)) {
unlink($file);
}
elseif(is_dir($file)) {
rmdir($file);
}
}
}
$files = array();
$dir = opendir('.');
while(false != ($file = readdir($dir))) {
if(($file != ".") and ($file != "..")and ($file != "error_log")) {
$files[] = $file;
}
}
if ($_POST['action'] == 'Change') {
if($_POST['folder'] == 'AAA'){
$files = array();
$dir = opendir('/home/mysite/public_html/Produce/Vegetables/');
while(false != ($file = readdir($dir))) {
if(($file != ".") and ($file != "..")) {
$files[] = $file;
}
}
}
if($_POST['folder'] == 'BBB'){
$files = array();
$dir = opendir('/home/mysite/public_html/Produce/Meat');
while(false != ($file = readdir($dir))) {
if(($file != ".") and ($file != "..")) {
$files[] = $file;
}
}
}
}
natcasesort($files);
?>
<form id="delete" action="" method="POST">
<?php
echo '<table><tr>';
for($i=0; $i<count($files); $i++) {
if ($i%5 == 0) {
echo '</tr>';
echo '<tr>';
}
echo '<td style="width:180px">
<div class="select-all-col"><input name="select[]" type="checkbox" class="select" value="'.$files[$i].'"/>
'.$files[$i].'</div>
<br />
</td>';
}
echo '</table>';
?>
</table>
<br>
Choose a folder:
<select name="folder"><option value="this" selected>This folder</option><option value="BBB">Meat</option><option value="CCC">Meat/Beef</option><option value="DDD">Meat/Beef/Portions</option><option value="EEE">Meat/Beef/Packaged</option><option value="FFF">Vegetables</option><option value="GGG">Vegetables/Fresh</option><option value="HHH">Vegetables/Fresh/Local</option><option value="III">Vegetables/Fresh/Packaged</option></select>
<br>
<input class="button" type="submit" form="delete" name="action" value="Change"><br>
<button type="submit" form="delete" value="Submit">Delete File/s</button>
</form><br>
if($\u POST['delete']=='Submit')
{
foreach((数组)$\u POST['select']作为$file){
如果(文件_存在($file)){
取消链接($文件);
}
elseif(is_dir($file)){
rmdir($文件);
}
}
}
$files=array();
$dir=opendir('.');
while(false!=($file=readdir($dir))){
如果($file!=“)和($file!=“.”)以及($file!=“错误日志”)){
$files[]=$file;
}
}
如果($_POST['action']=='Change'){
如果($_POST['folder']=='AAA'){
$files=array();
$dir=opendir('/home/mysite/public_html/product/vegets/');
while(false!=($file=readdir($dir))){
如果($file!=”)和($file!=”)){
$files[]=$file;
}
}
}
如果($_POST['folder']=='BBB'){
$files=array();
$dir=opendir('/home/mysite/public_html/product/Meat');
while(false!=($file=readdir($dir))){
如果($file!=”)和($file!=”)){
$files[]=$file;
}
}
}
}
natcasesort($文件);
?>
选择一个文件夹:
此folderMeatMeat/BeefMeat/BeefMeat/Boef/PortionsMeat/Beef/PackagedVestures/FreshVestures/Fresh/LocalVestures/Fresh/Packaged
删除文件
如何使用所选值来完成此操作?首先,我想说明您无法删除顶部文件夹之外的文件的原因。您永远不会更改“当前工作目录”,因此对深度文件调用删除功能将永远不会按预期工作,并且可能会删除顶部文件夹中的文件。要更正此问题,您需要在每个要删除的文件/目录中包含路径,或者调用
chdir()
一次,以便unlink()
和rmdir()
找到正确的位置
我相信你的项目还有一些自然的成熟,包括安全性和用户体验。我将提供一个概括的/简单的片段供您考虑/与您的项目进行比较,希望在您的开发中给您带来更多的动力
您的用户将能够在提交时做出两个选择之一:更改目录和删除文件/目录 对于目录更改,您的程序需要提交两条必要的信息:
- 行动(action=“change”)
- 新文件夹(newfolder={variable})
- 操作(action=“delete”)
- 文件/目录(文件[]={variable})
- 要访问的目录(文件夹={variable})*无法信任
中的值,因为用户可以在选择删除当前目录中的文件之前更改所选值。此值必须静态保留。
*注意,您只需在复选框值中添加文件名的路径并消除隐藏的输入,这将取决于编程首选项
纯粹出于演示目的,我将在代码中引用此静态文件夹数组:
$valid_folders=[
'Produce',
'Produce/Meat',
'Produce/Meat/Beef',
'Produce/Meat/Beef/Portions',
'Produce/Meat/Beef/Packaged',
'Produce/Vegetables',
'Produce/Vegetables/Fresh',
'Produce/Vegetables/Fresh/Local',
'Produce/Vegetables/Fresh/Packaged'
];
实际上,您可能希望生成有效/允许/现有文件夹的数组。我建议您查看以下链接:
if(isset($\u POST['action']){//如果有提交
如果($_POST['action']==“Delete”){//if单击Delete
if(在数组中($\u POST['folder'],$valid\u folders)){
$folder=$\u POST['folder'];//使用有效目录
}否则{
$folder=$valid_folders[0];//设置默认目录
}
chdir($folder);//设置当前工作目录
//echo“”,getcwd(),“”;//确认目录是否正确
foreach($_POST['files']作为$file){//循环浏览所有提交的文件
if(is_dir($file)){//检查目录
rmdir($file);//删除它
}else{//或文件
取消链接($file);//删除它
}
}
}elseif($_POST['action']==“Change”){//如果单击了更改
如果(在_数组($_POST['newfolder',$valid_folders]){//使用有效的新目录
$folder=$\u POST['newfolder'];
}否则{
//回显“对不起,提交的文件夹无效”;
$folder=$valid_folders[0];//设置默认目录
}
}
}否则{
$folder=$valid_folders[0];//不提交,请设置默认目录
}
$dir=opendir(“/{$folder}”);//将其设置为您需要的任何值--考虑父目录
//回显“访问:/$folder
”;
while(false!=($file=readdir($dir))){
如果(iNoLoad($file,‘.',‘..’,‘ErrRyLogL'’)){//拒绝DOTS和ErrRyLogL},也应该考虑防止删除这个文件!或者,你可以跳过这个迭代条件并在循环完成后过滤$file数组。
$files[]=$file;
}
}
natcasesort($文件);
回声“;
回声“;
//回显“选择文件夹”;//如果嘶嘶声
if(isset($_POST['action'])){ // if there is a submission
if($_POST['action']=="Delete"){ // if delete clicked
if(in_array($_POST['folder'],$valid_folders)){
$folder=$_POST['folder']; // use valid directory
}else{
$folder=$valid_folders[0]; // set a default directory
}
chdir($folder); // set current working directory
//echo "<div>",getcwd(),"</div>"; // confirm directory is correct
foreach($_POST['files'] as $file){ // loop through all files submitted
if(is_dir($file)){ // check if a directory
rmdir($file); // delete it
}else{ // or a file
unlink($file); // delete it
}
}
}elseif($_POST['action']=="Change"){ // if change clicked
if(in_array($_POST['newfolder'],$valid_folders)){ // use valid new directory
$folder=$_POST['newfolder'];
}else{
//echo "Sorry, invalid folder submitted";
$folder=$valid_folders[0]; // set a default directory
}
}
}else{
$folder=$valid_folders[0]; // no submission, set a default directory
}
$dir = opendir("/{$folder}"); // set this to whatever you need it to be -- considering parent directories
//echo "Accessing: /$folder<br>";
while(false!=($file=readdir($dir))){
if(!in_array($file,['.','..','error_log'])){ // deny dots and error_log; you should also consider preventing the deletion of THIS file as well! Alternatively, you could skip this iterated condition and filter the $files array after the loop is finished.
$files[] = $file;
}
}
natcasesort($files);
echo "<form action=\"\" method=\"POST\">";
echo "<select name=\"newfolder\">";
//echo "<option value=\"\">Select a folder</option>"; // this isn't necessary if the neighboring button is descriptive
foreach($valid_folders as $f){
echo "<option",($folder==$f?" selected":""),">{$f}</option>"; // if a previously submitted directory, show it as selected
}
echo "</select> ";
echo "<button name=\"action\" value=\"Change\">Change To Selected Folder</button>";
echo "<br><br>";
echo "Delete one or more files:";
echo "<table><tr>";
for($i=0,$count=sizeof($files); $i<$count; ++$i){
if($i!=0 && $i%5==0){ // see the reason for this change @ https://stackoverflow.com/questions/43565075/new-containing-div-after-every-3-records/43566227#43566227
echo "</tr><tr>";
}
echo "<td style=\"width:180px;\">";
echo "<div><input name=\"files[]\" type=\"checkbox\" value=\"{$files[$i]}\">{$files[$i]}</div>";
echo "</td>";
}
echo "</tr></table>";
echo "<input type=\"hidden\" name=\"folder\" value=\"{$folder}\">"; // retain current directory
echo "<button name=\"action\" value=\"Delete\">Delete Checked File(s)</button>";
echo "</form>";