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

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"];

2番目:私が理解していることから、選択すると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();

3 番目: 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 に答える