Запрос пользователя перед перезаписью файла Ob_get_contents()

Я использую функцию file_put_contents($file, 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!";

?>

1 ответ

Решение

Используя очень простую концепцию Wavemode, я исправил эту проблему с помощью AJAX get request. Я должен использовать 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);

Мне было бы интересно, если кто-нибудь предоставит лучшее решение этой проблемы. Ура!

Другие вопросы по тегам