1

PHPとmysqlを使用して複数のファイルをアップロードするための次のコードがあります。しかし、何らかの理由で、「n」個のファイルが選択されている場合、最後 (または「n」) のファイルのみがアップロードされているようです..

それぞれのファイルは次のとおりです。

HTML

    <form enctype="multipart/form-data" method="post" action="<?php echo htmlentities($_SERVER["PHP_SELF"]);?>">
           <div class="form-group">
           <textarea class="form-control" name="postbox" id="pbox"></textarea>
           </div>
           <h5><strong>Add media:</strong></h5>
           <input type="file" name="pfile[]" multiple="multiple" accept="image/*,audio/*,video/*"><br/>
          <button type="submit" class="btn btn-success" name="psubmit">Post!</button>
          </form>
<div class="posts">
<?php
  if(isset($_POST['postbox'])){
    $ps = escape($_POST['postbox']);
  }
  include_once('includes/uploadfile.php'); ?>
</div>

include/uploadfile.php

     <?php ob_start();
require_once 'core/init.php';

if(isset($_POST['psubmit']))
    {
        foreach ($_FILES['pfile']['tmp_name'] as $key=>$value)
      {
            $pfname = $_FILES["pfile"]['name'][$key];
            $pftype = $_FILES['pfile']['type'][$key];
            $pfsize = $_FILES['pfile']['size'][$key];
            $pftmploc = $_FILES['pfile']['tmp_name'][$key];
            $pferror = $_FILES['pfile']['error'][$key];
            $blast = explode(".", $pfname);
            $pfextn = end($blast);
            if (!empty($ps) && empty($pfname)) 
            {

                $dbfname = NULL;
                $abc = $get->addPost($a, $ps, $pfname);
                header('location:'.escape($_SERVER['PHP_SELF'])); exit;

            }

            else if (!empty($pfname) && !empty($ps))
            {
                //list($width, $height) = getimagesize($pftmploc);

                 if($pfsize > 20971520) 
                { 
                echo "ERROR: Your file was larger than 20 Megabytes in size.";
                unlink($pftmploc);
                exit();
                } 
                else if(!preg_match("/.(gif|jpg|png|mp3|mp4|avi)$/i", $pfname) ) 
                {
                 echo "ERROR: Restricted file format!Kindly stick to these formats alone:gif,jpg,png,mp3,mp4,avi";
                 unlink($pftmploc);
                 exit();
                }
                 else if($pferror == 1) 
                { // if file upload error key is equal to 1
                echo "ERROR: An error occured while processing the file. Try again.";
                exit();
                }
            }

             $dbfname = rand(100000000000,999999999999).$pfname;
            $updir = "ups/posts/";
            $arraymov = array();
            array_push($arraymov, $dbfname);
            $movrslt = move_uploaded_file($pftmploc,$updir.$dbfname);
            if($movrslt != true)
                {
                    echo 'ERROR: File upload failed. Try again!';
                    exit();
                }
          }  
                $abc = $get->addPost($a, $ps, implode(',',$arraymov));
            header('location:'.escape($_SERVER['PHP_SELF'])); exit;
     }  
?>

ファイルアップロード機能:

public function addPost($user_id,$status,$file_path){
                $query = $this->_db->prepare("INSERT INTO postsinitial (puid, pstatus, postimg) VALUES (:k, :l, :m)");
                $query->bindValue(':k',$user_id);
                $query->bindValue(':l', nl2br(htmlentities($status, ENT_QUOTES, 'UTF-8')));
                $query->bindValue(':m',$file_path);
                $query->execute();
                $rsizes = $query->rowCount();

                 if ($rsizes > 0) {
                  return true;
                  }
                   else
                  {
                   return false;
                  }
            }

ユーザーがデータベース内の 1 つのレコードのみに対して複数の画像をアップロードできるように、各ファイル パスをコンマ区切りの値の配列として挿入するコードを作成しようとしました。これは重要です。

事前にTnx!

4

2 に答える 2

0

ロジックが間違っているようです。$_FILES 配列をループする同じ foreach() 内で move_uploaded_file() を実行する必要があります。

...
echo "ERROR: An error occured while processing the file. Try again.";
            exit();
       }
   }

   move_uploaded_file(...
}

$pftmploc 変数を一時ファイル パスとして使用して、別の foreach ブロックで move_uploaded_file() を実行しようとしています。しかし、その変数は前の foreach() ループ内で割り当てられたため、アップロードされたファイル配列の最後の要素を表しています。そのため、すべてのファイルがアップロードされていません。

于 2017-02-15T07:59:52.253 に答える