2016-06-10 172 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({