2016-06-10 174 views
0

对于文件管理,我使用表单来重命名通过foreach循环显示的文件。如何使用ajax重命名文件

首先在PHP:

if(isset($_POST['rename'])) { 
    if(!is_dir($_POST['old_name'])) { 
     rename($_POST['old_name'], $NewFileName); 
     exit; 
    } 
} 

形式:

<form class="sfmform" method="post" action=""> 
     <input type="hidden" name="old_name" value="<?php echo $dir.'/'.$file; ?>" /> 
     <input class="new_name" type="text" name="new_name" placeholder="only a-z, A-Z and 0-9" value="" /> 
     <input type="submit" class="rename" name="rename" value="Go" />  

    </form> 

注:形式是foreach循环的一部分,并且是每个文件邻近

的JS(给ajaxForm):

$('.sfmform').ajaxForm({ 

    success: function(data) { 
     status.html(data); 
     $('.myFiles').load(document.URL + ' .myFiles'); 

    }, 

}); 

div .my文件包含在其中的foreach循环的渲染文件。

发生了什么: 拳头重命名正确;如果没有硬刷新,他会重命名这些文件,并且它会立即可见,因为div .myFiles已加载。 但第二次重命名出错了;他遵循PHP中的循环并死亡。 如果我不使用出口;在PHP中,他生成了几次myFiles div。

当我做了一个硬刷新;我可以重新命名。但是在没有硬刷新的情况下两次重命名,他就死了。

我在做什么错了?

我也有其他形式的目录与相同的类:sfmfom,这些不是foreach循环的一部分。与他们在一起,我没有问题两次使用它们。 为什么这只会发生在foreach循环的一部分? 我怎样才能使这项工作正确?

更新:的foreach

/* RENDER THE FILES */ 
foreach ($files as $file) { 
if ($file != '.' && $file != '..') { // don't show links to previous folders 
    $MimeFileType = mime_content_type($dir.'/'.$file); 
    $FileExtension = pathinfo($file, PATHINFO_EXTENSION); 
    $ClassExtension = 'sfm_'.$FileExtension; 

....... 
<td> 
    <!-- RENAME --> 
    <form class="sfmform" method="post" action=""> 
     <input type="hidden" name="old_name" value="<?php echo $dir.'/'.$file; ?>" /> 
     <input class="new_name" type="text" name="new_name" placeholder="only a-z, A-Z and 0-9" value="" /> 
     <input type="submit" class="rename" name="rename" value="Go" />  

    </form> 

</td> 
} 
} 
+4

只是等待,直到有人开始提交'old_name =/etc/passwd'和其他有趣的路径到你的脚本! – jszobody

+0

什么循环在PHP?正如@jszobody所说:这段代码是非常危险的 - 你允许用户指定** ANY **文件/路径,他们知道你的服务器上的名字。这会打开你盗窃机器上几乎所有的文件。 –

+0

@jszobody我知道操纵旧名称的问题。但是这是其他地方的保护!但那不是我的问题...... –

回答

0

发现的解决方案:

JS的应该是这样的:

$(".sfmform").livequery(function() { $(this).ajaxForm({ 

,而不是这样的:

$('.sfmform').ajaxForm({