2014-09-23 117 views
0

我使用file_put_contents($文件,ob_get_contents())函數在PHP創建一個動態表單生成的文件的快照,並存儲在服務器上的文件的內容。它工作得很好,但如果有已經有相同名稱的文件,我想提示用戶詢問是否要覆蓋。使用AJAX,我可以通過隱藏的輸入字段傳遞文件的名稱,但無法傳遞文件的內容。如果還有其他更簡單的選擇,我不需要AJAX。提示用戶覆蓋

這裏: $ file是表單生成的文件的名稱。

if(file_exists($file)) 
{ 
    echo '<div style="background:#000; padding:10px"><center style="color:#fff">File aready exists! '; 
    echo '<button type="button" onclick="loadXMLDoc()">Overwrite it!</button><div id="myDiv"></div></div><input type="hidden" id="hiddenfile" value="'.$file.'"></center>'; 
} 
else{ 
    file_put_contents($file, ob_get_contents());  
    echo '<div style="background:#000; padding:10px"><center><a href="'."/newslettercms/webversion/".$file.'" download style="color:#fff;">Click here to download the newsletter</a> &bull; <a href="'."/newslettercms/webversion/".$file.'" target="_blank" style="color:#ddd">View web version</a></center></div>'; 

} 


<script> 

function loadXMLDoc() 
{ 
var xmlhttp; 
if (window.XMLHttpRequest) 
    {// code for IE7+, Firefox, Chrome, Opera, Safari 
    xmlhttp=new XMLHttpRequest(); 
    } 
else 
    {// code for IE6, IE5 
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
xmlhttp.onreadystatechange=function() 
    { 
    if (xmlhttp.readyState==4 && xmlhttp.status==200) 
    { 
    document.getElementById("myDiv").innerHTML=xmlhttp.responseText; 
    } 
    } 

    var hiddenfile=document.getElementById("hiddenfile").value; 
xmlhttp.open("GET","inc/overwrite.php?hiddenfile="+hiddenfile,true); 
xmlhttp.send(); 
} 
</script> 

Overwrite.php

<?php 
$file=$_GET['hiddenfile']; 
file_put_contents($file, ob_get_contents()); 
    echo '<div style="background:#000; padding:10px"><center><a href="'."/newslettercms/webversion/".$file.'" download style="color:#fff;">Click here to download the newsletter</a> &bull; <a href="'."/newslettercms/webversion/".$file.'" target="_blank" style="color:#ddd">View web version</a></center></div>'; 

echo "File overwritten success!"; 

?> 
+0

我看到的是最簡單的方法,如果該文件存在,只需將文件保存爲'$文件。 'temp',然後提示用戶是否要用臨時文件覆蓋原件。 – wavemode 2014-09-23 04:44:29

+0

爲什麼此解決方案無法正常工作? – kasimir 2014-09-23 08:08:17

+0

@kasimir怎麼把AJAX get請求無法將內容傳遞給overwrite.php文件。 – floCoder 2014-09-24 02:15:22

回答

1

使用Wavemode的非常簡單的概念,我固定使用AJAX請求得到這個問題。我必須使用AJAX,否則整個頁面都會刷新,動態生成的內容將會丟失。我在這裏使用AJAX的正確軌道,但我試圖使用file_put_contents()在飛行中覆蓋。這是我如何解決這個問題的代碼。

if(file_exists($file)) 
{ 
    $file2="temp-".$file; 
    file_put_contents($file2, ob_get_contents()); 
    echo '<div style="background:#000; padding:10px"><center style="color:#fff">File aready exists! '; 
    echo '<button type="button" onclick="loadXMLDoc()">Overwrite it!</button><div id="myDiv"></div></div><input type="hidden" id="newfilename" value="'.$file2.'"><input type="hidden" id="oldfilename" value="'.$file.'"></center>'; 
} 
else{ 
    file_put_contents($file, ob_get_contents());  
    echo '<div style="background:#000; padding:10px"><center><a href="'."/newslettercms/webversion/".$file.'" download style="color:#fff;">Click here to download the newsletter</a> &bull; <a href="'."/newslettercms/webversion/".$file.'" target="_blank" style="color:#ddd">View web version</a></center></div>'; 
} 
?> 

<script> 

function loadXMLDoc() 
{ 
var xmlhttp; 
if (window.XMLHttpRequest) 
    {// code for IE7+, Firefox, Chrome, Opera, Safari 
    xmlhttp=new XMLHttpRequest(); 
    } 
else 
    {// code for IE6, IE5 
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
xmlhttp.onreadystatechange=function() 
    { 
    if (xmlhttp.readyState==4 && xmlhttp.status==200) 
    { 
    document.getElementById("myDiv").innerHTML=xmlhttp.responseText; 
    } 
    } 

    var oldfilename=document.getElementById("oldfilename").value; 
    var newfilename=document.getElementById("newfilename").value; 
xmlhttp.open("GET","inc/overwrite.php?oldfilename="+oldfilename+"&newfilename="+newfilename,true); 
xmlhttp.send(); 
} 
</script> 

Overwrite.php

$newfilename=$_GET['newfilename']; 
$oldfilename=$_GET['oldfilename']; 

rename($newfilename,$oldfilename); 

我有興趣,如果有人提供更好的解決這個問題。乾杯!