【问题标题】:multiple file upload uploads only single post多个文件上传仅上传单个帖子
【发布时间】:2017-02-13 19:52:34
【问题描述】:

我有以下代码用于使用 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>

包含/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;
                  }
            }

我尝试编写代码以将每个文件路径插入为以逗号分隔的值数组,以便用户可以为数据库中的一条记录上传多张图片。这很重要!

Tnx 提前!

【问题讨论】:

    标签: php mysql multiple-file-upload


    【解决方案1】:

    看来你的逻辑有误。您必须在遍历 $_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() 循环中分配的,它代表了上传文件数组的最后一个元素。这就是为什么您没有上传所有文件的原因。

    【讨论】:

    • tq 为您的建议...好吧,我尝试过再次重新编辑了问题...请检查它..bt 问题是,现在虽然文件正在移动,但只有一个名字正在记录在数据库中..我想要一个包含所有图像名称的数组,针对该帖子的数据库中的单个 post_id 行..!
    • @Vanessa341 这很简单。你必须拿出 $arraymov = array(); foreach() 循环中的语句。它应该在您开始循环之前放置。按此顺序: if(isset($_POST['psubmit'])) { $arraymov = array(); foreach(($_FILES['pfile' ......
    • @Vanessa341 很高兴它有帮助。
    【解决方案2】:

    foreach 看起来不太正确。在您的uploadfile.php 中尝试这个sn-p 来代替foreach 部分。它构建你的循环有点不同,检查 tmp_name 以查看循环是否应该继续。

    if(isset($_POST['psubmit']))
    {
        $imagearray = array();
        for ($i = 0; $_FILES['pfile']['tmp_name'][$i] $i++)
        {
            $pfname = $_FILES["pfile"]['name'][$i];
            $pftype = $_FILES['pfile']['type'][$i];
            $pfsize = $_FILES['pfile']['size'][$i];
            $pftmploc = $_FILES['pfile']['tmp_name'][$i];
            $pferror = $_FILES['pfile']['error'][$i];
            $blast = explode(".", $pfname);
            $pfextn = end($blast);
            array_push($imagearray, $pfname);
            if (!empty($ps) && empty($pfname)) 
            { ...
    

    【讨论】:

    • tq for ur prompt ans..will tr​​y n get back!!
    • 不,还是一样..只有最后一个文件被上传
    • 不太确定。您的代码中的某些元素可能被我们看不到的其他代码所掩盖。例如,什么是“$ps”?我看不到该变量的定义位置。此外,还有一些不一致之处,例如在一个具有以下条件的“if”语句中:“!empty($pfname)&&!empty($ps)”,你有另一个“if”语句:“if(empty( $ps))" 那个内部的永远不会被执行。我只能假设有些东西要么被取出,要么从其他来源复制进来。不放弃,但也许你可以澄清一些事情。在此期间我会再看一看。
    • tq fr ur 建议....是的,我在 betn 中取出代码,这意味着其他文件类型,因为我只想允许多个图像上传...你认为我没有正确编辑它b4 发布!...我将相应地编辑我的问题...
    猜你喜欢
    • 1970-01-01
    • 2017-11-14
    • 2020-01-17
    • 2017-11-17
    • 1970-01-01
    • 2016-04-14
    • 2019-12-23
    • 2019-01-29
    • 1970-01-01
    相关资源
    最近更新 更多