Php 如何删除服务器上的文件并根据客户端的选择添加新文件

Php 如何删除服务器上的文件并根据客户端的选择添加新文件,php,Php,我大致了解了如果文件不存在,如何将文件上载到服务器。现在,如果文件存在,我希望客户端能够覆盖/删除现有文件并上载新文件。是,两个文件必须具有相同的名称 因此,我试图做的是,当文件存在时,使用一个switch语句调用一个函数,该函数要么删除现有文件并上载新文件,要么强制php代码死亡,从而取消上载 if (isset($_GET['run'])) $linkchoice=$_GET['run']; else $linkchoice=''; switch($linkch

我大致了解了如果文件不存在,如何将文件上载到服务器。现在,如果文件存在,我希望客户端能够覆盖/删除现有文件并上载新文件。是,两个文件必须具有相同的名称

因此,我试图做的是,当文件存在时,使用一个switch语句调用一个函数,该函数要么删除现有文件并上载新文件,要么强制php代码死亡,从而取消上载

    if (isset($_GET['run'])) $linkchoice=$_GET['run']; 
    else $linkchoice=''; 

    switch($linkchoice){ 
      case 'one' : 
          upload_file();
          break;
      case 'two' : 
          kill();
          break;
然后给我们一个链接来执行一个函数

   <a class=button href='?run=one'>Replace Existing File</a><br/>
   <a class=button href='?run=two'>Cancel Upload</a>

下面是我如何把这一切放在一起的

    <?php
    error_reporting(E_ALL);
    ini_set('display_errors',1);


    $allowedExts = array("xml");
    $temp = explode(".", $_FILES["file"]["name"]);
    $extension = end($temp);
    if (($_FILES["file"]["type"] == "text/xml")
    && in_array($extension, $allowedExts)){
      if ($_FILES["file"]["error"] > 0){
        echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
      }

      else{
        if (file_exists("SIMxml/" . $_FILES["file"]["name"])){

        echo $_FILES["file"]["name"] . " file already exists.<br/>";
        $file = $_FILES["file"]["name"];
        $type = $_FILES["file"]["type"];
        $size = ($_FILES["file"]["size"] / 1024);

       /* if (isset($_GET['run'])) $linkchoice=$_GET['run']; 
          else $linkchoice=''; 

            switch($linkchoice){ 

            case 'one' : 
              upload_file($file,$type,$size,$temp); 


            case 'two' : 
              kill(); 

            }

           echo "<a class=button href='?run=one'>Replace Existing File</a><br/>";
           echo "<a class=button href='?run=two'>Cancel Upload</a>"; */

           }

         else{
           echo "File: " . $_FILES["file"]["name"] . "<br>";
           echo "Type: " . $_FILES["file"]["type"] . "<br>";
           echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";

           move_uploaded_file($_FILES["file"]["tmp_name"],
           "/var/www/jd/SIMxml/" . $_FILES["file"]["name"]);
           echo "Stored in: " . "SIMxml/" . $_FILES["file"]["name"];
           }
        }
     }
     else{
       echo "Invalid file";
       }

   ?>

   <?php
   error_reporting(E_ALL);
   ini_set('display_errors',1);

   function delete_file($file){
     unlink("/var/www/jd/SIMxml/" . $file);
     }
   function upload_file($file,$type,$size,$temp){
     echo $file;
     delete_file($file);

     echo "File: " . $file . "<br>";
     echo "Type: " . $type . "<br>";
     echo "Size: " . $size . " kB<br>";

     move_uploaded_file($temp,
     "/var/www/jd/SIMxml/" . $file);
     echo "Stored in: " . "SIMxml/" . $file;
     }
   function kill(){

     }

   ?>

显然,这不起作用,我正在努力将几个概念/想法捆绑在一起或实现起来

如果能给我一些关于如何实施这一点的建议,我将不胜感激


提前谢谢,JD不是答案,但不适合发表评论:

    if (file_exists("SIMxml/" . $_FILES["file"]["name"])){
在这里,您使用相对路径,但如果您的脚本更改了其当前工作目录,那么您最终会遇到麻烦,因为在其他地方:

move_uploaded_file($_FILES["file"]["tmp_name"], "/var/www/jd/SIMxml/" . ...


您使用绝对路径。这不是个好主意。

答案不是,但不适合评论:

    if (file_exists("SIMxml/" . $_FILES["file"]["name"])){
在这里,您使用相对路径,但如果您的脚本更改了其当前工作目录,那么您最终会遇到麻烦,因为在其他地方:

move_uploaded_file($_FILES["file"]["tmp_name"], "/var/www/jd/SIMxml/" . ...


您使用绝对路径。这不是一个好主意。

请记住,您有两个单独的请求——第一个是上载文件,第二个是尝试设置选项,但您不再有“文件”,因为它是一个新请求

您需要:

  • 存储对某个位置上载的文件的引用,例如在会话中,或
  • 更改您的流程,以便在上载文件之前进行确定,例如使用(a)同步javascript请求来确定将上载的文件名是否已经存在,并在允许提交/上载之前使用该确定来请求额外的输入——这是一种预上载请求

  • 请记住,您有两个单独的请求——第一个是上载文件,第二个是尝试设置选项,但您不再有“文件”,因为它是一个新请求

    您需要:

  • 存储对某个位置上载的文件的引用,例如在会话中,或
  • 更改您的流程,以便在上载文件之前进行确定,例如使用(a)同步javascript请求来确定将上载的文件名是否已经存在,并在允许提交/上载之前使用该确定来请求额外的输入——这是一种预上载请求

  • 因此,@Jacob S让我想到了如何分离我的请求,我没有创建会话或实现“预上传”请求,而是选择了一种不同的路径

    在代码的第一个版本(最初的问题)中,我尝试将switch语句嵌入到逻辑操作中,但似乎失败了,因为没有传递文件的参数。所以为了避开这个问题

    首先:我检查文件是否存在,如果存在,然后从实际的临时文件创建一个伪临时文件

        if (file_exists("/var/www/jd/SIMxml/" . $file)){
                  $ftemp = "/var/www/jd/temp/" . $file;
                  move_uploaded_file($tmp,
                  $ftemp);
    
    从我使用的表单中获取$tmp文件名

        $tmp = $_FILES["file"]["tmp_name"];
    
    第二:据我所知,我使用了一个超链接,当选中它时,它将调用php文件delete.php。超链接中嵌入了重命名伪临时文件所需的参数

        echo "<p><a class=button href='delete.php?run=one&file=$file&temp=$temp'>
              Replace Existing File</a></p>";
        echo "<p><a class=button href='delete.php?run=two&file=$file&temp=$ftemp'>
              Cancel Upload</a></p>";
        die();
    

    现在,实现我想做的事情的最好方法是什么?可能不会,但到目前为止它正在发挥作用。如果不是很明显,我还应该指出,这是从stackoverflow和其他网站上的其他问题中拼凑出来的,这不是一个“原创”的想法,可能是完成手头任务的最糟糕的方式,所以请记住这一点

    因此,@Jacob S让我想到了如何分离我的请求,而不是创建会话或实现“预上传”请求,我选择了一种不同的路径

    在代码的第一个版本(最初的问题)中,我尝试将switch语句嵌入到逻辑操作中,但似乎失败了,因为没有传递文件的参数。所以为了避开这个问题

    首先:我检查文件是否存在,如果存在,然后从实际的临时文件创建一个伪临时文件

        if (file_exists("/var/www/jd/SIMxml/" . $file)){
                  $ftemp = "/var/www/jd/temp/" . $file;
                  move_uploaded_file($tmp,
                  $ftemp);
    
    从我使用的表单中获取$tmp文件名

        $tmp = $_FILES["file"]["tmp_name"];
    
    第二:据我所知,我使用了一个超链接,当选中它时,它将调用php文件delete.php。超链接中嵌入了重命名伪临时文件所需的参数

        echo "<p><a class=button href='delete.php?run=one&file=$file&temp=$temp'>
              Replace Existing File</a></p>";
        echo "<p><a class=button href='delete.php?run=two&file=$file&temp=$ftemp'>
              Cancel Upload</a></p>";
        die();
    

    现在,实现我想做的事情的最好方法是什么?可能不会,但到目前为止它正在发挥作用。如果不是很明显,我还应该指出,这是从stackoverflow和其他网站上的其他问题中拼凑出来的,这不是一个“原创”的想法,可能是完成手头任务的最糟糕的方式,所以请记住这一点

    取消链接('/var/www/jd/SIMxml/'.$filename)取消链接('/var/www/jd/SIMxml/'.$filename),所以我应该坚持其中一个,对吗。考虑到我知道目录位置在我可预见的未来永远不会改变,但我很可能会改变php文件的位置,我应该坚持使用绝对路径?所以我应该坚持使用其中一个,对吗。考虑到我知道在我可预见的未来目录位置永远不会改变,但我很可能会改变php文件的位置,我应该坚持使用绝对路径吗?