1

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

所以我试图做的是当文件存在时使用一个 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

4

3 回答 3

1

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

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

在这里你使用相对路径,但如果你的脚本改变了它的当前工作目录,你最终会遇到无穷无尽的麻烦,因为在其他地方:

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

unlink("/var/www/jd/SIMxml/" . $file);

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

于 2013-07-25T18:17:06.590 回答
0

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

您要么需要:

  1. 存储对在某处上传的文件的引用,例如在会话中,或
  2. 更改您的流程,以便在上传文件之前做出决定,例如使用 (a) 同步 javascript 请求来确定将要上传的文件名是否已经存在,并使用该决定在允许提交/上传之前请求额外的输入- 各种预上传请求。
于 2013-07-25T18:21:28.377 回答
0

所以,@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();

第三:在delete.php文件中设置我的函数

    <?php
    function delete_file($file){
       unlink("/var/www/jd/SIMxml/" . $file);
       if (file_exists("/var/www/jd/SIMxml/" . $file)){
           echo "SIMxml/" . $file. " Was not deleted";
    }
    function upload_file($file,$temp){
        rename ($temp, "/var/www/jd/SIMxml/" . $file);

        if (file_exists("/var/www/jd/SIMxml/" . $file)){
            echo "Stored in: " . "SIMxml/" . $file;
        }
        else{
            echo $file,"<br/>";;
            die ("File was not uploaded.");
        }
    }
    function kill($temp){
        unlink($temp);
        die('The upload was canceled');
    }
    ?> 

这是调用删除和上传函数来完成上传过程的php段。您可以在此处使用 switch 语句,但也不要选择。

    <?php
    if($_REQUEST['run'] == 'one'){
        delete_file($_GET['file']);
        upload_file($_GET['file'],$_GET['temp']);
    }
    if($_REQUEST['run'] == 'two'){
        kill($_GET['temp']);
    }
    ?>    

我假设超链接创建了某种类型的关联数组,并且 $_Get 检索数组中的参数,但还不太确定它是如何工作的。但我知道它得到了我需要的东西

        upload_file($_GET['file'],$_GET['temp']);
    }
    ?>

现在,是完成我想做的最好的方法吗?可能不是,但到目前为止它正在工作。我还应该说明,如果不是很明显,这是从stackoverflow和其他网站上的其他问题拼凑起来的,这不是“原始”想法,它可能是完成手头任务的最糟糕的方式, 所以记住这一点。

于 2013-07-26T20:58:47.623 回答