Téléchargement de fichiers multiples en PHP

122

Je veux télécharger plusieurs fichiers et les stocker dans un dossier, obtenir le chemin et le stocker dans la base de données ... Tout bon exemple que vous avez recherché pour le téléchargement de plusieurs fichiers ...

Remarque: les fichiers peuvent être de n'importe quel type ...

udaya
la source
2
Voici un bon exemple à suivre: EXEMPLE
jini
@sarfraz j'ai eu un week-end ... Je viens d'essayer l'exemple c'est génial si facile
udaya
@sarfraz J'ai essayé de générer le <td> <input name = "ufile []" type = "file" id = "ufile []" size = "50" /> </td> à partir d'un clic d'ajout, j'ai obtenu le < td> sur ajouter cliquez mais le résultat n'est pas atteint Pouvez-vous voir ma nouvelle question postée
udaya

Réponses:

260

Je sais que c'est un ancien article, mais quelques explications supplémentaires pourraient être utiles pour quelqu'un qui essaie de télécharger plusieurs fichiers ... Voici ce que vous devez faire:

  • Le nom d'entrée doit être défini comme un tableau, c'est-à-dire name="inputName[]"
  • L'élément d'entrée doit avoir multiple="multiple"ou justemultiple
  • Dans votre fichier PHP, utilisez la syntaxe "$_FILES['inputName']['param'][index]"
  • Assurez-vous de rechercher des noms de fichiers et des chemins vides , le tableau peut contenir des chaînes vides . Utiliser array_filter()avant le comptage.

Voici un exemple bas et sale (montrant juste le code pertinent)

HTML:

<input name="upload[]" type="file" multiple="multiple" />

PHP:

//$files = array_filter($_FILES['upload']['name']); //something like that to be used before processing files.

// Count # of uploaded files in array
$total = count($_FILES['upload']['name']);

// Loop through each file
for( $i=0 ; $i < $total ; $i++ ) {

  //Get the temp file path
  $tmpFilePath = $_FILES['upload']['tmp_name'][$i];

  //Make sure we have a file path
  if ($tmpFilePath != ""){
    //Setup our new file path
    $newFilePath = "./uploadFiles/" . $_FILES['upload']['name'][$i];

    //Upload the file into the temp dir
    if(move_uploaded_file($tmpFilePath, $newFilePath)) {

      //Handle other code here

    }
  }
}

J'espère que cela aide!

Andy Braham
la source
1
Je ne suis pas sûr <input type="file">autorise l'attribut multiple- quel serait le résultat attendu? Navigateur permettant de sélectionner plusieurs fichiers?
Sven
9
@Sven Oui, il est pris en charge en HTML5, consultez ce lien , ma mauvaise apparence, comme IE, ne le supporte pas ... Geeze notre vie serait tellement plus facile si tout le monde suivait les normes ... LOL
Andy Braham
7
@AndyBraham L' multipleattribut de l'élément d'entrée est booléen, ce qui signifie que vous ne lui fournissez pas de valeur: <input name="upload[]" type="file" multiple /> Voir la spécification HTML5: w3.org/TR/2011/WD-html5-20110525/…
Rob Johansen
11
Il convient de mentionner que l'utilisateur doit sélectionner tous les fichiers à la fois. Toute nouvelle tentative de sélection annulera la sélection précédente.
Skippy le Grand Gourou du
2
@AlienBishop n'est pas tout à fait correct ici, multiple = "multiple" est parfaitement bien et est inclus dans les spécifications comme alternative.
kojow7
38

Plusieurs fichiers peuvent être sélectionnés puis téléchargés à l'aide de l'
<input type='file' name='file[]' multiple>
exemple de script php qui effectue le téléchargement:

<html>
<title>Upload</title>
<?php
    session_start();
    $target=$_POST['directory'];
        if($target[strlen($target)-1]!='/')
                $target=$target.'/';
            $count=0;
            foreach ($_FILES['file']['name'] as $filename) 
            {
                $temp=$target;
                $tmp=$_FILES['file']['tmp_name'][$count];
                $count=$count + 1;
                $temp=$temp.basename($filename);
                move_uploaded_file($tmp,$temp);
                $temp='';
                $tmp='';
            }
    header("location:../../views/upload.php");
?>
</html>

Les fichiers sélectionnés sont reçus sous forme de tableau avec

$_FILES['file']['name'][0]stocker le nom du premier fichier.
$_FILES['file']['name'][1]stocker le nom du deuxième fichier.
etc.

rjv
la source
existe-t-il un moyen d'accéder aux chemins de fichiers de chaque fichier avec JS lors du téléchargement de plusieurs fichiers? par exemple, pour des fichiers uniques, vous pouvez simplement interroger fileInput.value, mais j'ai remarqué que lorsque plusieurs fichiers sont sélectionnés, fileInput.value ne génère toujours qu'un seul chemin ...
oldboy
6

HTML

  1. créer div avec id='dvFile';

  2. créer un button;

  3. onclick de cette fonction d'appel de bouton add_more()

JavaScript

function  add_more() {
  var txt = "<br><input type=\"file\" name=\"item_file[]\">";
  document.getElementById("dvFile").innerHTML += txt;
}

PHP

if(count($_FILES["item_file"]['name'])>0)
 { 
//check if any file uploaded
 $GLOBALS['msg'] = ""; //initiate the global message
  for($j=0; $j < count($_FILES["item_file"]['name']); $j++)
 { //loop the uploaded file array
   $filen = $_FILES["item_file"]['name']["$j"]; //file name
   $path = 'uploads/'.$filen; //generate the destination path
   if(move_uploaded_file($_FILES["item_file"]['tmp_name']["$j"],$path)) 
{
   //upload the file
    $GLOBALS['msg'] .= "File# ".($j+1)." ($filen) uploaded successfully<br>";
    //Success message
   }
  }
 }
 else {
  $GLOBALS['msg'] = "No files found to upload"; //No file upload message 
}

De cette façon, vous pouvez ajouter des fichiers / images, autant que nécessaire, et les gérer via un script php.

kdniazi
la source
1
Remplacez ce document.getElementById ("dvFile"). InnerHTML + = txt; avec $ ("#dvFile") .append (txt); il sauvera votre pièce jointe
Rahul rajoria
Cette réponse est obsolète (et trop compliquée pour quelque chose d'aussi simple, à mon avis). Pour une réponse correcte, consultez @ rjv's
Vladimir Nul
@VladimirNul existe-t-il un moyen d'accéder aux chemins de fichiers de chaque fichier avec JS lors du téléchargement de plusieurs fichiers? par exemple, pour des fichiers uniques, vous pouvez simplement interroger fileInput.value, mais j'ai remarqué que lorsque plusieurs fichiers sont sélectionnés, fileInput.valueil ne
génère
@Anthony on dirait que tu fais ça en javascript, je ne vois pas l'intérêt. Veuillez vérifier la réponse de rjv.
Vladimir Nul
5

Ce n'est pas si différent du téléchargement d'un fichier - $_FILESest un tableau contenant tous les fichiers téléchargés.

Il y a un chapitre dans le manuel PHP: Télécharger plusieurs fichiers

Si vous souhaitez activer plusieurs téléchargements de fichiers avec une sélection facile du côté de l'utilisateur (en sélectionnant plusieurs fichiers à la fois au lieu de remplir les champs de téléchargement), jetez un œil à SWFUpload . Cela fonctionne différemment d'un formulaire de téléchargement de fichiers normal et nécessite Flash pour fonctionner. SWFUpload était obsolète avec Flash. Vérifiez les autres réponses plus récentes pour l'approche maintenant correcte.

Pekka
la source
1
Cette réponse est obsolète. Pour une réponse correcte, consultez @ rjv's
Vladimir Nul
Vrai. Édité pour refléter cela.
Pekka
4
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>
<?php
$max_no_img=4; // Maximum number of images value to be set here

echo "<form method=post action='' enctype='multipart/form-data'>";
echo "<table border='0' width='400' cellspacing='0' cellpadding='0' align=center>";
for($i=1; $i<=$max_no_img; $i++){
echo "<tr><td>Images $i</td><td>
<input type=file name='images[]' class='bginput'></td></tr>";
}

echo "<tr><td colspan=2 align=center><input type=submit value='Add Image'></td></tr>";
echo "</form> </table>";
while(list($key,$value) = each($_FILES['images']['name']))
{
    //echo $key;
    //echo "<br>";
    //echo $value;
    //echo "<br>";
if(!empty($value)){   // this will check if any blank field is entered
$filename =rand(1,100000).$value;    // filename stores the value

$filename=str_replace(" ","_",$filename);// Add _ inplace of blank space in file name, you can remove this line

$add = "upload/$filename";   // upload directory path is set
//echo $_FILES['images']['type'][$key];     // uncomment this line if you want to display the file type
//echo "<br>";                             // Display a line break
copy($_FILES['images']['tmp_name'][$key], $add); 
echo $add;
    //  upload the file to the server
chmod("$add",0777);                 // set permission to the file.
}
}
?>
</body>
</html>
muaz khalid
la source
Cette réponse est obsolète. Pour une réponse correcte, consultez @ rjv's
Vladimir Nul
4

C'est simple, il suffit de compter d'abord le tableau de fichiers, puis dans la boucle while, vous pouvez facilement le faire comme

$count = count($_FILES{'item_file']['name']);

maintenant vous avez le nombre total de fichiers correct.

Dans la boucle while, procédez comme suit:

$i = 0;
while($i<$count)
{
    Upload one by one like we do normally
    $i++;
}
pseudo
la source
1
Il manque quelque chose ici, veuillez jeter un œil à la réponse de @ rjv.
Vladimir Nul
4

ce script simple a fonctionné pour moi.

<?php

foreach($_FILES as $file){
  //echo $file['name']; 
  echo $file['tmp_name'].'</br>'; 
  move_uploaded_file($file['tmp_name'], "./uploads/".$file["name"]);
}

?>
Rohit Mandiwal
la source
3

Voici une fonction que j'ai écrite qui renvoie un $_FILEStableau plus compréhensible .

function getMultiple_FILES() {
    $_FILE = array();
    foreach($_FILES as $name => $file) {
        foreach($file as $property => $keys) {
            foreach($keys as $key => $value) {
                $_FILE[$name][$key][$property] = $value;
            }
        }
    }
    return $_FILE;
}
Cheejyg
la source
2

Je lance une boucle foreach avec un élément d'erreur, ressemble à

 foreach($_FILES['userfile']['error'] as $k=>$v)
 {
    $uploadfile = 'uploads/'. basename($_FILES['userfile']['name'][$k]);
    if (move_uploaded_file($_FILES['userfile']['tmp_name'][$k], $uploadfile)) 
    {
        echo "File : ", $_FILES['userfile']['name'][$k] ," is valid, and was                      successfully uploaded.\n";
    }

    else 
    {
        echo "Possible file : ", $_FILES['userfile']['name'][$k], " upload attack!\n";
    }   

 }
VHC
la source
0

Nous pouvons facilement télécharger plusieurs fichiers en utilisant php en utilisant le script ci-dessous.

Télécharger le code source complet et un aperçu

<?php
if (isset($_POST['submit'])) {
    $j = 0; //Variable for indexing uploaded image 

 $target_path = "uploads/"; //Declaring Path for uploaded images
    for ($i = 0; $i < count($_FILES['file']['name']); $i++) {//loop to get individual element from the array

        $validextensions = array("jpeg", "jpg", "png");  //Extensions which are allowed
        $ext = explode('.', basename($_FILES['file']['name'][$i]));//explode file name from dot(.) 
        $file_extension = end($ext); //store extensions in the variable

  $target_path = $target_path . md5(uniqid()) . "." . $ext[count($ext) - 1];//set the target path with a new name of image
        $j = $j + 1;//increment the number of uploaded images according to the files in array       

   if (($_FILES["file"]["size"][$i] < 100000) //Approx. 100kb files can be uploaded.
                && in_array($file_extension, $validextensions)) {
            if (move_uploaded_file($_FILES['file']['tmp_name'][$i], $target_path)) {//if file moved to uploads folder
                echo $j. ').<span id="noerror">Image uploaded successfully!.</span><br/><br/>';
            } else {//if file was not moved.
                echo $j. ').<span id="error">please try again!.</span><br/><br/>';
            }
        } else {//if file size and file type was incorrect.
            echo $j. ').<span id="error">***Invalid file Size or Type***</span><br/><br/>';
        }
    }
}
?>
Merbin Joe
la source
0
$property_images = $_FILES['property_images']['name'];
    if(!empty($property_images))
    {
        for($up=0;$up<count($property_images);$up++)
        {
            move_uploaded_file($_FILES['property_images']['tmp_name'][$up],'../images/property_images/'.$_FILES['property_images']['name'][$up]);
        }
    }
Vishnu Bhadoriya
la source
1
Veuillez vérifier cette URL, cela vous sera utile pour améliorer la qualité de votre contenu
Willie Cheng
0

C'est ce qui a fonctionné pour moi. Je devais télécharger des fichiers, stocker des noms de fichiers et j'avais des inof supplémentaires à stocker dans les champs d'entrée et un enregistrement pour plusieurs noms de fichiers. J'ai utilisé serialize () puis ajouté cela à la requête SQL principale.

  class addReminder extends dbconn {
    public function addNewReminder(){

           $this->exdate = $_POST['exdate'];
           $this->name = $_POST['name'];
           $this->category = $_POST['category'];
           $this->location = $_POST['location'];
           $this->notes = $_POST['notes'];



           try {

                     if(isset($_POST['submit'])){
                       $total = count($_FILES['fileUpload']['tmp_name']);
                       for($i=0;$i<$total;$i++){
                         $fileName = $_FILES['fileUpload']['name'][$i];
                         $ext = pathinfo($fileName, PATHINFO_EXTENSION);
                         $newFileName = md5(uniqid());
                         $fileDest = 'filesUploaded/'.$newFileName.'.'.$ext;
                         $justFileName = $newFileName.'.'.$ext;
                         if($ext === 'pdf' || 'jpeg' || 'JPG'){
                             move_uploaded_file($_FILES['fileUpload']['tmp_name'][$i], $fileDest);
                             $this->fileName = array($justFileName);
                             $this->encodedFileNames = serialize($this->fileName);
                             var_dump($this->encodedFileNames);
                         }else{
                           echo $fileName . ' Could not be uploaded. Pdfs and jpegs only please';
                         }
                       }

                    $sql = "INSERT INTO reminders (exdate, name, category, location, fileUpload, notes) VALUES (:exdate,:name,:category,:location,:fileName,:notes)";
                    $stmt = $this->connect()->prepare($sql);
                    $stmt->bindParam(':exdate', $this->exdate);
                    $stmt->bindParam(':name', $this->name);
                    $stmt->bindParam(':category', $this->category);
                    $stmt->bindParam(':location', $this->location);
                    $stmt->bindParam(':fileName', $this->encodedFileNames);
                    $stmt->bindParam(':notes', $this->notes);
                    $stmt->execute();
                  }

           }catch(PDOException $e){
             echo $e->getMessage();
           }
      }
    }
Adam Falchetta
la source
-1

Beau lien sur:

Téléchargement de fichier unique PHP avec des explications de base variées .

Téléchargement de fichiers PHP avec la validation

Téléchargement de plusieurs fichiers PHP avec validation Cliquez ici pour télécharger le code source

Téléchargement de plusieurs fichiers PHP / jQuery avec la barre de progression et la validation (cliquez ici pour télécharger le code source)

Comment télécharger des fichiers en PHP et stocker dans la base de données MySql (Cliquez ici pour télécharger le code source)

extract($_POST);
    $error=array();
    $extension=array("jpeg","jpg","png","gif");
    foreach($_FILES["files"]["tmp_name"] as $key=>$tmp_name)
            {
                $file_name=$_FILES["files"]["name"][$key];
                $file_tmp=$_FILES["files"]["tmp_name"][$key];
                $ext=pathinfo($file_name,PATHINFO_EXTENSION);
                if(in_array($ext,$extension))
                {
                    if(!file_exists("photo_gallery/".$txtGalleryName."/".$file_name))
                    {
                        move_uploaded_file($file_tmp=$_FILES["files"]["tmp_name"][$key],"photo_gallery/".$txtGalleryName."/".$file_name);
                    }
                    else
                    {
                        $filename=basename($file_name,$ext);
                        $newFileName=$filename.time().".".$ext;
                        move_uploaded_file($file_tmp=$_FILES["files"]["tmp_name"][$key],"photo_gallery/".$txtGalleryName."/".$newFileName);
                    }
                }
                else
                {
                    array_push($error,"$file_name, ");
                }
            }

et vous devez vérifier votre code HTML

<form action="create_photo_gallery.php" method="post" enctype="multipart/form-data">
    <table width="100%">
        <tr>
            <td>Select Photo (one or multiple):</td>
            <td><input type="file" name="files[]" multiple/></td>
        </tr>
        <tr>
            <td colspan="2" align="center">Note: Supported image format: .jpeg, .jpg, .png, .gif</td>
        </tr>
        <tr>
            <td colspan="2" align="center"><input type="submit" value="Create Gallery" id="selectedButton"/></td>
        </tr>
    </table>
</form>

Beau lien sur:

Téléchargement de fichier unique PHP avec des explications de base variées .

Téléchargement de fichiers PHP avec la validation

Téléchargement de plusieurs fichiers PHP avec validation Cliquez ici pour télécharger le code source

Téléchargement de plusieurs fichiers PHP / jQuery avec la barre de progression et la validation (cliquez ici pour télécharger le code source)

Comment télécharger des fichiers en PHP et stocker dans la base de données MySql (Cliquez ici pour télécharger le code source)

Kalpesh Rajai
la source