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>
}
}
只是等待,直到有人开始提交'old_name =/etc/passwd'和其他有趣的路径到你的脚本! – jszobody
什么循环在PHP?正如@jszobody所说:这段代码是非常危险的 - 你允许用户指定** ANY **文件/路径,他们知道你的服务器上的名字。这会打开你盗窃机器上几乎所有的文件。 –
@jszobody我知道操纵旧名称的问题。但是这是其他地方的保护!但那不是我的问题...... –