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我知道操縱舊名稱的問題。但是這是其他地方的保護!但那不是我的問題...... –