2017-02-13 122 views
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> 

包括/ 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提前!

回答

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()循环内部赋值的,它代表了上传的文件数组的最后一个元素。这就是为什么你没有得到所有的文件上传。

+0

tq为你的建议......以及我试过n再次重新编辑了这个问题......请检查它..bt的东西是,现在虽然文件被移动,oly一个名字被记录在分贝。 .i想要一个数组的所有图像名称与数据库中该post的单个post_id行..! – Vanessa341

+0

@ Vanessa341这很容易。你必须取出$ arraymov = array();声明在foreach()循环之外。它应该放在你开始循环之前。按以下顺序: if(isset($ _ POST ['psubmit'])) { $ arraymov = array(); foreach(($ _ FILES ['pfile'...... –

+0

哇!!!! tnx很多!!! – Vanessa341

0

该foreach看起来不太正确。在你的uploadfile.php代替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)) 
     { ... 
+0

tq为你的提示ans..will试试n回来!! – Vanessa341

+0

nope仍然相同..只有最后一个文件正在升级 – Vanessa341

+0

不太确定。您的代码中有些元素可能被我们没有看到的其他代码遮挡。例如,什么是“$ ps”?我看不到变量的定义。另外,还有一些不一致的地方,就像在一个具有这个标准的“if”语句里面:“!empty($ pfname)&&!empty($ ps)”,你有另一个“if”语句:“if(empty $ ps))“内部的一个永远不会被执行。我只能假设有些东西要么被拿出来,要么从其他来源复制东西。不放弃,但也许你可以澄清事情。在此期间我会再看一次。 – TBowman