2017-02-13 5 views
1

J'ai le code suivant pour plusieurs téléchargements de fichiers en utilisant php et mysql. Mais pour une raison quelconque, si les fichiers « n » sont sélectionnés, seul le dernier fichier (ou « n-ième) semble être téléchargé ..le téléchargement de fichiers multiples télécharge uniquement un seul article

Voici les fichiers respectifs:

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> 

comprend/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; 
    } 
?> 

fonction de téléchargement du fichier:

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; 
        } 
      } 

J'ai essayé de code à insérer chaque chemin de fichier en tant que tableau de valeurs séparées par des virgules de sorte qu'un utilisateur peut télécharger des images multiples pour un seul enregistrement en database.This est important!

Tnx à l'avance!

Répondre

0

On dirait que la logique est incorrecte. Vous devez exécuter move_uploaded_file() dans le même foreach() qui parcourt le tableau $ _FILES.

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

    move_uploaded_file(... 
} 

Ce que vous avez fait est d'essayer d'exécuter move_uploaded_file() dans un bloc de foreach distinct à l'aide variable pftmploc de $ que le chemin du fichier temporaire. Mais puisque cette variable a été assignée à l'intérieur de la boucle foreach() précédente, elle représente le dernier élément du tableau de fichiers téléchargés. C'est pourquoi vous n'obtenez pas tous les fichiers téléchargés.

+0

tq pour votre suggestion ... eh bien j'ai essayé n ont ré-édité la question à nouveau ... veuillez vérifier ..... la chose est, maintenant si les fichiers sont déplacés, oly un nom est en cours d'enregistrement dans la DB. .je veux un tableau de tous les noms d'image sur une seule ligne post_id dans la base de données pour ce post ..! – Vanessa341

+0

@ Vanessa341 c'est facile. Vous devez sortir $ arraymov = array(); déclaration hors de la boucle foreach(). Il devrait être placé juste avant de commencer la boucle.Dans cet ordre: if (isset ($ _ POST ['psubmit'])) { $ arraymov = array(); foreach (($ _ FICHIERS ['pfile' ...... –

+0

wow !!!! tnx beaucoup !!! – Vanessa341

0

Le foreach ne semble pas tout à fait correct. Essayez cet extrait dans votre uploadfile.php à la place de la partie foreach. Il construit votre boucle un peu différemment, en vérifiant le tmp_name pour voir si la boucle devrait continuer.

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 pour ur invite rapide..will essayer n revenir !! – Vanessa341

+0

non encore la même chose ... seulement le dernier fichier s étant remonté – Vanessa341

+0

Pas vraiment sûr. il y a des éléments de votre code qui sont obscurcis éventuellement par d'autres codes que nous ne voyons pas. Par exemple, qu'est-ce que "$ ps"? Je ne vois pas où cette variable est définie. Il existe également des incohérences, comme dans une instruction "if" qui a ce critère: "! Empty ($ pfname) &&! Empty ($ ps)", vous avez une autre instruction "if" avec ceci: "if (empty ($ ps)) "Celui interne ne sera jamais exécuté. Je ne peux que supposer qu'il y avait des choses soit retirées, soit copiées d'autres sources. Ne pas abandonner, mais peut-être pourriez-vous clarifier les choses. Je vais avoir un autre regard en attendant. – TBowman