167 votes

Comment puis-je sélectionner et télécharger plusieurs fichiers avec HTML et PHP, en utilisant HTTP POST ?

J'ai l'expérience de faire cela avec des téléchargements de fichiers uniques en utilisant <input type="file"> . Cependant, j'ai du mal à en télécharger plus d'un à la fois.

Par exemple, j'aimerais sélectionner une série d'images, puis les télécharger sur le serveur, en une seule fois.

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

Quelqu'un sait-il comment y parvenir ?

3 votes

Vous voulez dire sélectionner plus d'un fichier dans la boîte de dialogue de sélection de fichiers ou utiliser des entrées de fichiers multiples ?

1 votes

Bonjour, est-il possible de télécharger un fichier d'archive (zip, rar, tar, ...) ?

208voto

mehaase Points 6824

Cela 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 du fichier :

chrome multiple file select

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

submitting multiple files to PHP

Ce n'est qu'une esquisse d'une réponse entièrement fonctionnelle. Voir Manuel PHP : Gestion des téléchargements de fichiers pour plus d'informations sur le traitement approprié et sécurisé des téléchargements de fichiers en PHP.

9 votes

Passe-t-il la validation w3c, ou doit-il être multiple="multiple" ?

10 votes

Je crois que c'est valable : thoughtresults.com/html5-boolean-attributes . Il passe le validateur w3c si vous ajoutez <!doctype html>.

2 votes

Oui, il valide probablement le HTML, mais pas le XHTML. Même si j'aime toujours utiliser le XHTML, je pense que les gens conseillent de s'en éloigner de nos jours.

96voto

Epoxys Points 611

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

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

Alors la clé du succès ;

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

n'oubliez PAS ces supports ! Dans le fichier post_upload.php, essayez ce qui suit :

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

Remarquez 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 parenthèses avec l'exemple du fichier 'numéro' :

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

Vous pouvez utiliser php count() pour compter le nombre de fichiers qui ont été sélectionnés. Bonne chance, widdit !

5 votes

Merci pour cette astuce ! Cela m'a fait gagner beaucoup de temps +1

0 votes

Cela fonctionne très bien ... mais j'ai des difficultés à télécharger de cette façon dans Internet Explorer (v8). Je pense que IE ne prend pas en charge le téléchargement de cette manière.

4 votes

Ou vous pouvez parcourir les fichiers en boucle avec un foreach sans avoir à connaître le nombre de fichiers téléchargés...

8voto

Thaps Points 56

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>

0 votes

Le code a été coupé. Voici ce qui vient juste au-dessus : <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>

3 votes

Cela n'a pas fonctionné dans IE8, mais il suffit d'utiliser un vrai navigateur.

5voto

MitMaro Points 2604

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

Si vous parlez d'utiliser plusieurs entrées de fichiers, il ne devrait pas y avoir beaucoup de différence avec l'utilisation d'un seul fichier. Envoyez un code et j'essaierai de vous aider.


Mise à jour : Il existe une méthode permettant d'utiliser un seul bouton "Parcourir" qui utilise Flash. Je ne l'ai jamais utilisé personnellement mais j'ai lu beaucoup de choses à ce sujet. Je pense que c'est votre meilleure chance.

http://swfupload.org/

1 votes

J'ai ajouté le lien vers l'uploader multiple basé sur Flash.

0 votes

J'ai utilisé swfupload pour ma part - c'est un peu pénible à l'occasion mais ce n'est pas vraiment difficile à faire fonctionner.

0 votes

@Barsoom a raison. Les choses se sont beaucoup améliorées en ce qui concerne les téléchargements de fichiers multiples au cours des deux dernières années. :D

1voto

Torandi Points 999

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

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