Télécharger plusieurs fichiers simultanément

Le téléchargement de plusieurs fichiers est possible en utilisant des noms différents dans l'attribut name de la balise input.

Il est aussi possible de télécharger plusieurs fichiers simultanément et d'obtenir les informations sous forme de tableau. Pour cela, il faut utiliser la syntaxe de tableau dans les noms de balises HTML, comme pour les sélections multiples et les boîtes à cocher.

Exemple #1 Télécharger plusieurs fichiers simultanément

<form action="file-upload.php" method="post" enctype="multipart/form-data">
  Envoyez plusieurs fichiers : <br />
  <input name="userfile[]" type="file" /><br />
  <input name="userfile[]" type="file" /><br />
  <input type="submit" value="Envoyer les fichiers" />
</form>

Lorsque le formulaire ci-dessus a été envoyé, les tableaux $_FILES['userfile'], $_FILES['userfile']['name'], et $_FILES['userfile']['size'] seront initialisés.

Par exemple, supposons que les fichiers /home/test/review.html et /home/test/xwp.out ont été téléchargés. Dans ce cas, $_FILES['userfile']['name'][0] contient review.html et $_FILES['userfile']['name'][1] contient xwp.out. De même, $_FILES['userfile']['size'][0] va contenir la taille du fichier review.html, etc.

$_FILES['userfile']['name'][0], $_FILES['userfile']['tmp_name'][0], $_FILES['userfile']['size'][0] et $_FILES['userfile']['type'][0] sont aussi créées.

Avertissement

Le paramètre max_file_uploads limite le nombre de fichiers qui peuvent être envoyés en une requête. Il faut vérifier que le formulaire ne tente pas d'envoyer plus de fichiers dans la requête que ne le tolère cette limite.

Exemple #2 Téléverser un dossier entier

Dans les champs de téléversement de fichier HTML, il est possible de téléverser un dossier entier avec l'attribut webkitdirectory. Cette fonctionnalité est supportée dans la plupart des navigateurs modernes.

Avec l'information full_path, il est possible de stocker les chemins relatifs ou reconstruire la même hiérarchie de dossier sur le dossier.

<form action="file-upload.php" method="post" enctype="multipart/form-data">
  Envoyez ce dossier :<br />
  <input name="userfile[]" type="file" webkitdirectory multiple />
  <input type="submit" value="Envoyer les fichiers" />
</form>
Avertissement

L'attribut webkitdirectory n'est pas standard et n'est pas actuellement en cours de standardisation. Ceci n'est pas à utiliser sur des sites de production tournés vers le Web : ça ne fonctionnera pas pour tous les utilisateurs. Il peut y avoir de grandes incompatibilités parmi les implémentations et le comportement peut changer dans le futur.

PHP analyse uniquement les informations des chemins relatifs soumis par le navigateur/user-agent et transmet les informations dans le tableau $_FILES. Il n'y a aucune garantie que les valeurs dans le tableau full_path contiennent une vraie structure de dossier et l'application PHP ne doit pas faire confiance à cette information.