web-dev-qa-db-fra.com

Comment sélectionner et télécharger plusieurs fichiers avec HTML et PHP à l'aide de HTTP POST?

J'ai de l'expérience dans le téléchargement de fichiers uniques en utilisant <input type="file">. Cependant, j'ai du mal à télécharger plus d'un fichier à la fois.

Par exemple, j'aimerais pouvoir sélectionner une série d'images, puis les télécharger simultanément sur le serveur.

Ce serait bien d'utiliser un seul contrôle de fichier, si possible.

Est ce que quelqu'un sait comment accomplir cela? Merci!

142
stalepretzel

Ceci est possible dans HTML5 . Exemple (PHP 5.4):

<!doctype html>
<html>
    <head>
        <title>Test</title>
    </head>
    <body>
        <form method="post" enctype="multipart/form-data">
            <input type="file" name="my_file[]" multiple>
            <input type="submit" value="Upload">
        </form>
        <?php
            if (isset($_FILES['my_file'])) {
                $myFile = $_FILES['my_file'];
                $fileCount = count($myFile["name"]);

                for ($i = 0; $i < $fileCount; $i++) {
                    ?>
                        <p>File #<?= $i+1 ?>:</p>
                        <p>
                            Name: <?= $myFile["name"][$i] ?><br>
                            Temporary file: <?= $myFile["tmp_name"][$i] ?><br>
                            Type: <?= $myFile["type"][$i] ?><br>
                            Size: <?= $myFile["size"][$i] ?><br>
                            Error: <?= $myFile["error"][$i] ?><br>
                        </p>
                    <?php
                }
            }
        ?>
    </body>
</html>

Voici à quoi cela ressemble dans Chrome après avoir sélectionné 2 éléments dans la boîte de dialogue de fichier:

chrome multiple file select

Et voici à quoi cela ressemble après avoir cliqué sur le bouton "Télécharger".

submitting multiple files to PHP

Ceci est juste un croquis d'une réponse pleinement opérationnelle. Voir Manuel PHP: Gestion des envois de fichiers pour plus d'informations sur la gestion correcte et sécurisée des envois de fichiers en PHP.

183
Mark E. Haase

Il y a quelques choses que vous devez faire pour créer un téléchargement de plusieurs fichiers, c'est assez basique en fait. Vous n'avez pas besoin d'utiliser Java, Ajax, Flash. Il suffit de créer un formulaire de téléchargement de fichier normal commençant par:

<form enctype="multipart/form-data" action="post_upload.php" method="POST">

Ensuite, la clé du succès.

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

n'oubliez pas ces crochets! Dans le post_upload.php, essayez ce qui suit:

<?php print_r($_FILES['file']['tmp_name']); ?>

Notez que vous obtenez un tableau avec les données tmp_name, ce qui signifie que vous pouvez accéder à chaque fichier avec une troisième paire de crochets avec l'exemple de fichier 'numéro':

$_FILES['file']['tmp_name'][0]

Vous pouvez utiliser php count () pour compter le nombre de fichiers sélectionnés. Goodluck Widdit!

92
Epoxys

Solution complète dans Firefox 5:

<html>
<head>
</head>
<body>
 <form name="uploader" id="uploader" action="multifile.php" method="POST" enctype="multipart/form-data" >
  <input id="infile" name="infile[]" type="file" onBlur="submit();" multiple="true" ></input> 
 </form>

<?php
echo "No. files uploaded : ".count($_FILES['infile']['name'])."<br>"; 


$uploadDir = "images/";
for ($i = 0; $i < count($_FILES['infile']['name']); $i++) {

 echo "File names : ".$_FILES['infile']['name'][$i]."<br>";
 $ext = substr(strrchr($_FILES['infile']['name'][$i], "."), 1); 

 // generate a random new file name to avoid name conflict
 $fPath = md5(Rand() * time()) . ".$ext";

 echo "File paths : ".$_FILES['infile']['tmp_name'][$i]."<br>";
 $result = move_uploaded_file($_FILES['infile']['tmp_name'][$i], $uploadDir . $fPath);

 if (strlen($ext) > 0){
  echo "Uploaded ". $fPath ." succefully. <br>";
 }
}
echo "Upload complete.<br>";
?>

</body>
</html>
7
Thaps

Si vous souhaitez sélectionner plusieurs fichiers à partir de la boîte de dialogue de sélection de fichier qui s'affiche lorsque vous sélectionnez Parcourir, vous n’avez généralement pas de chance. Vous devrez utiliser un applet Java ou quelque chose de similaire (je pense qu'il y en a un qui utilise un petit fichier flash, je le mettrai à jour si je le trouve). Actuellement, une entrée de fichier unique permet uniquement la sélection d'un fichier unique.

Si vous parlez d’utiliser plusieurs entrées de fichier, il ne devrait pas y avoir beaucoup de différence d’en utiliser une. Poster du code et je vais essayer d'aider plus loin.


Mise à jour: il existe une méthode pour utiliser un seul bouton 'parcourir' qui utilise le flash. Je n'ai jamais personnellement utilisé cela, mais j'ai lu pas mal de choses à ce sujet. Je pense que c'est votre meilleur coup.

http://swfupload.org/

5
MitMaro

dans le premier cas, vous devriez créer un formulaire comme ceci:

<form method="post" enctype="multipart/form-data" >
   <input type="file" name="file[]" multiple id="file"/>
   <input type="submit" name="ok"  />
</form> 

c'est vrai . ajoutez maintenant ce code sous votre code de formulaire ou sur la page de votre choix

<?php
if(isset($_POST['ok']))
   foreach ($_FILES['file']['name'] as $filename) {
    echo $filename.'<br/>';
}
?>

c'est facile ... fini

4
pooya laryan
<form action="" method="POST" enctype="multipart/form-data">
  Select image to upload:
  <input type="file"   name="file[]" multiple/>
  <input type="submit" name="submit" value="Upload Image" />
</form>

Utiliser FOR Loop

<?php    
  $file_dir  = "uploads";    
  if (isset($_POST["submit"])) {

    for ($x = 0; $x < count($_FILES['file']['name']); $x++) {               

      $file_name   = $_FILES['file']['name'][$x];
      $file_tmp    = $_FILES['file']['tmp_name'][$x];

      /* location file save */
      $file_target = $file_dir . DIRECTORY_SEPARATOR . $file_name; /* DIRECTORY_SEPARATOR = / or \ */

      if (move_uploaded_file($file_tmp, $file_target)) {                        
        echo "{$file_name} has been uploaded. <br />";                      
      } else {                      
        echo "Sorry, there was an error uploading {$file_name}.";                               
      }                 

    }               
  }    
?>

Utiliser FOREACH Loop

<?php
  $file_dir  = "uploads";    
  if (isset($_POST["submit"])) {

    foreach ($_FILES['file']['name'] as $key => $value) {                   

      $file_name   = $_FILES['file']['name'][$key];
      $file_tmp    = $_FILES['file']['tmp_name'][$key];

      /* location file save */
      $file_target = $file_dir . DIRECTORY_SEPARATOR . $file_name; /* DIRECTORY_SEPARATOR = / or \ */

      if (move_uploaded_file($file_tmp, $file_target)) {                        
        echo "{$file_name} has been uploaded. <br />";                      
      } else {                      
        echo "Sorry, there was an error uploading {$file_name}.";                               
      }                 

    }               
  }
?>
1
antelove

il y a encore un téléchargeur basé sur Flash qui est gratuit, ploadify .

Holger - moteur de recherche Amidalla

1

Si vous utilisez plusieurs champs de saisie, vous pouvez définir name = "fichier []" (ou tout autre nom). Cela les mettra dans un tableau lorsque vous les téléchargerez ($_FILES['file'] = array ({file_array},{file_array]..))

1
Torandi

j'ai créé une fonction php qui est utilisée pour télécharger plusieurs images. Cette fonction permet de télécharger plusieurs images dans un dossier spécifique. Elle permet également d'enregistrer les enregistrements dans la base de données sous le code suivant: $ arrayimage est le tableau d'images envoyé via le formulaire qu'il n'autorise pas le téléchargement à utiliser plusieurs fichiers, mais que vous devez créer un champ de saisie différent portant le même nom, de même que vous pouvez définir le champ d'ajout dynamique de la sortie de fichier lors d'un clic de bouton.

$ dir est le répertoire dans lequel vous souhaitez enregistrer l'image $ champs est le nom du champ que vous souhaitez stocker dans la base de données

le champ de base de données doit être dans un exemple de formate de tableau si vous avez imagestore de base de données et nom de champs comme id

$fields=array("id"=$_POST['idfieldname'], "name"=$_POST['namefield'],"address"=$_POST['addressfield']);

puis passez ce champ dans les champs fonction $

$ table est le nom de la table dans laquelle vous voulez stocker les données.

function multipleImageUpload($arrayimage,$dir,$fields,$table)
{
    //extracting extension of uploaded file
    $allowedExts = array("gif", "jpeg", "jpg", "png");
    $temp = explode(".", $arrayimage["name"]);
    $extension = end($temp);

    //validating image
    if ((($arrayimage["type"] == "image/gif")
    || ($arrayimage["type"] == "image/jpeg")
    || ($arrayimage["type"] == "image/jpg")
    || ($arrayimage["type"] == "image/pjpeg")
    || ($arrayimage["type"] == "image/x-png")
    || ($arrayimage["type"] == "image/png"))

    //check image size

    && ($arrayimage["size"] < 20000000)

    //check iamge extension in above created extension array
    && in_array($extension, $allowedExts)) 
    {
        if ($arrayimage["error"] > 0) 
        {
            echo "Error: " . $arrayimage["error"] . "<br>";
        } 
        else 
        {
            echo "Upload: " . $arrayimage["name"] . "<br>";
            echo "Type: " . $arrayimage["type"] . "<br>";
            echo "Size: " . ($arrayimage["size"] / 1024) . " kB<br>";
            echo "Stored in: ".$arrayimage['tmp_name']."<br>";

            //check if file is exist in folder of not
            if (file_exists($dir."/".$arrayimage["name"])) 
            {
                echo $arrayimage['name'] . " already exists. ";
            } 
            else 
            {
                //extracting database fields and value
                foreach($fields as $key=>$val)
                {
                    $f[]=$key;
                    $v[]=$val;
                    $fi=implode(",",$f);
                    $value=implode("','",$v);
                }
                //dynamic sql for inserting data into any table
                $sql="INSERT INTO " . $table ."(".$fi.") VALUES ('".$value."')";
                //echo $sql;
                $imginsquery=mysql_query($sql);
                move_uploaded_file($arrayimage["tmp_name"],$dir."/".$arrayimage['name']);
                echo "<br> Stored in: " .$dir ."/ Folder <br>";

            }
        }
    } 
    //if file not match with extension
    else 
    {
        echo "Invalid file";
    }
}
//function imageUpload ends here
}

// la classe imageFunctions se termine ici

vous pouvez essayer ce code pour insérer plusieurs images avec son extension cette fonction est créée pour vérifier les fichiers image vous pouvez remplacer la liste des extensions pour les fichiers spécifiques dans le code

0
Prateik Darji