143 votes

Téléchargement multiple de fichiers en php

Je veux télécharger plusieurs fichiers, les stocker dans un dossier, récupérer le chemin d'accès et le stocker dans la base de données... Avez-vous un bon exemple pour le téléchargement de plusieurs fichiers ?

Note : Les fichiers peuvent être de n'importe quel type...

2 votes

2 votes

Voici un bon exemple à suivre : EXEMPLE

0 votes

@sarfraz J'ai eu un week-end ... Je viens d'essayer l'exemple, c'est génial et très facile.

321voto

Andy Braham Points 958

Je sais qu'il s'agit d'un vieux post 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 de l'entrée doit être défini sous la forme d'un tableau, à savoir name="inputName[]"
  • L'élément d'entrée doit avoir multiple="multiple" ou simplement multiple
  • Dans votre fichier PHP, utilisez la syntaxe "$_FILES['inputName']['param'][index]"
  • Assurez-vous de rechercher noms et chemins de fichiers vides le tableau peut contenir chaînes vides . Utilisez array_filter() avant de compter.

Voici un exemple concret (qui ne montre que 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 vous aidera !

1 votes

Je ne suis pas sûr. <input type="file"> permet à l'attribut multiple - Quel serait le résultat attendu ? Un navigateur permettant de sélectionner plusieurs fichiers ?

12 votes

@Sven Oui, il est pris en charge par HTML5, consultez cette page. lien Je suis désolé, mais il semble que IE ne supporte pas cela... Bon sang, notre vie serait tellement plus facile si tout le monde suivait les normes... LOL

1 votes

@AndyBraham réponse brillante, j'ai gagné beaucoup de temps :)

41voto

rjv Points 1781

Plusieurs fichiers peuvent être sélectionnés puis téléchargés à l'aide de la fonction
<input type='file' name='file[]' multiple>
L'exemple de php script qui fait 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] mémoriser le nom du premier fichier.
$_FILES['file']['name'][1] mémorisant le nom du deuxième fichier.
et ainsi de suite.

0 votes

Existe-t-il un moyen d'accéder aux chemins d'accès de chaque fichier avec JS lors du téléchargement de plusieurs fichiers ? par exemple, pour les fichiers uniques, vous pouvez simplement interroger fileInput.value, mais j'ai remarqué que lorsque plusieurs fichiers sont sélectionnés, fileInput.value n'affiche toujours qu'un seul chemin...

6voto

kdniazi Points 21

HTML

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

  2. créer un button ;

  3. onclick de ce bouton appelant la fonction 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 par le biais de php script.

1 votes

Remplacez ceci document.getElementById("dvFile").innerHTML += txt ; avec $("#dvFile" ).append(txt ) ; cela permettra de sauvegarder votre pièce jointe

0 votes

Cette réponse est obsolète (et trop compliquée pour quelque chose d'aussi simple, à mon avis). Pour une réponse correcte, consultez la réponse de @rjv.

0 votes

@VladimirNul existe-t-il un moyen d'accéder aux chemins d'accès de chaque fichier avec JS lors du téléchargement de plusieurs fichiers ? Par exemple, pour les fichiers uniques, vous pouvez simplement interroger fileInput.value mais j'ai remarqué que lorsque plusieurs fichiers sont sélectionnés fileInput.value ne produit toujours qu'un seul chemin...

5voto

Pekka 웃 Points 249607

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

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

Si vous souhaitez permettre le téléchargement de plusieurs fichiers avec une sélection facile du côté de l'utilisateur (sélection de plusieurs fichiers à la fois au lieu de remplir les champs de téléchargement), jetez un coup d'oeil à SWFUpload . Il fonctionne différemment d'un formulaire normal de téléchargement de fichiers et nécessite cependant Flash pour fonctionner. SWFUpload a été obsolète en même temps que Flash. Consultez les autres réponses, plus récentes, pour connaître l'approche désormais correcte.

1 votes

Cette réponse est obsolète. Pour une réponse correcte, consultez la réponse de @rjv.

0 votes

C'est vrai. Modifié pour refléter cela.

4voto

muaz khalid Points 51
<!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>

0 votes

Cette réponse est obsolète. Pour une réponse correcte, consultez la réponse de @rjv.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X