web-dev-qa-db-fra.com

Téléchargement de plusieurs fichiers en php

Je veux télécharger plusieurs fichiers, les stocker dans un dossier, obtenir le chemin et les stocker dans la base de données ... Vous avez cherché un bon exemple pour effectuer plusieurs téléchargements ... 

Remarque: Les fichiers peuvent être de tout type ...

96
udaya

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

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

Voici un exemple bas et sale (montrant seulement 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 ça aide!

207
Andy Braham

Plusieurs fichiers peuvent être sélectionnés puis téléchargés à l'aide du
<input type='file' name='file[]' multiple>
L'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] stockant le nom du premier fichier.
$_FILES['file']['name'][1] stockant le nom du deuxième fichier.
etc.

33
rjv

HTML

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

  2. créer une button;

  3. onclickde 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 via un script php.

6
kdniazi

Ce n'est pas si 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écharger plusieurs fichiers

Si vous souhaitez activer plusieurs téléchargements de fichiers avec une sélection facile du côté de l'utilisateur (sélectionner plusieurs fichiers à la fois au lieu de renseigner des champs de téléchargement), consultez SWFUpload . Cela fonctionne différemment d'un formulaire de téléchargement de fichier normal et nécessite cependant que Flash fonctionne. SWFUpload était obsolète avec Flash. Vérifiez l’autre, réponses plus récentes, pour l’approche désormais correcte.

4
Pekka 웃
<!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>
4
muaz khalid

C'est simple, il suffit de compter le tableau de fichiers en premier, puis en boucle, vous pouvez facilement faire comme 

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

vous avez maintenant le nombre total de fichiers correct.

Dans la boucle while faites comme ceci:

$i = 0;
while($i<$count)
{
    Upload one by one like we do normally
    $i++;
}
4
Nick

Voici une fonction que j'ai écrite qui retourne un tableau plus compréhensible $_FILES.

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

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"]);
}

?>
2
Rohit Mandiwal

Je lance une boucle foreach avec un élément error,

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

 }
1
HCV

Je viens de trouver la solution suivante:

http://www.mydailyhacks.org/2014/11/05/php-multifile-uploader-for-php-5-4-5-5/

il s'agit d'un script de téléchargement de fichiers multiples PHP prêt à l'emploi, avec un formulaire dans lequel vous pouvez ajouter plusieurs entrées et une barre de progression AJAX. Cela devrait fonctionner directement après la décompression sur le serveur ...

1
Peter

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/>';
        }
    }
}
?>
0
Merbin Joe
$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]);
        }
    }
0
Vishnu Bhadoriya