Comment sélectionner plusieurs fichiers avec <input type = “file”>?

110

Comment sélectionner plusieurs fichiers avec <input type="file">?

Masque
la source
Il s'agit de javascript et html
Masque
Voulez-vous dire télécharger plusieurs fichiers en une seule fois (lorsque vous en sélectionnez un à la fois, puis cliquez sur télécharger)? Ou voulez-vous dire en utilisant ctrl + clic pour sélectionner plusieurs fichiers dans une fenêtre de navigateur?
cletus
2
Vous pouvez le faire avec HTML5 en utilisant l'attribut multiple sur l'élément d'entrée. <input type = 'file' multiple = ''> Voici un excellent violon qui l'utilise: jsfiddle.net/0GiS0/Yvgc2
Costa

Réponses:

126

Nouvelle réponse:

En HTML5, vous pouvez ajouter l' multipleattribut pour sélectionner plus d'un fichier.

<input type="file" name="filefield" multiple="multiple">

Ancienne réponse:

Vous ne pouvez sélectionner qu'un seul fichier par <input type="file" />. Si vous souhaitez envoyer plusieurs fichiers, vous devrez utiliser plusieurs balises d'entrée ou utiliser Flash ou Silverlight.

ZippyV
la source
7
Gmail utilise Flash pour ce faire
Fabien Ménager
19
Pas depuis HTML5. Il existe un attribut multiple pour le champ de saisie.
Costa
2
@Costa Le 20 octobre 2009, la plupart des navigateurs ne supportaient pas cette fonctionnalité et Niavlys montrait déjà la solution html5 il y a 2 ans.
ZippyV
2
cette réponse est plus ancienne que les dinosaures
Cliquez sur Upvote
2
ce multiple = "multiple" n'est pas convivial, l'utilisateur moyen ne le comprend pas, ne sait même pas ce que fait un "bouton ctrl" et il ne peut pas sélectionner des fichiers dans différents dossiers.
Jean-Paul
84

Il existe également du HTML5 <input type="file" multiple />( spécification ).

La prise en charge du navigateur est assez bonne sur le bureau (mais non prise en charge par IE 9 et les versions antérieures), moins bonne sur mobile, je suppose parce que c'est plus difficile à implémenter correctement en fonction de la plate-forme et de la version.

Niavlys
la source
9
Non pris en charge sur IE9 et antérieurs :(
Ashit Vora
7
envisager d'ajoutername="files[]"
Wariored
22

Le tout devrait ressembler à:

<form enctype='multipart/form-data' method='POST' action='submitFormTo.php'> 
    <input type='file' name='files[]' multiple />
    <button type='submit'>Submit</button>
</form>

Assurez-vous d'avoir l' enctype='multipart/form-data'attribut dans votre <form>balise, sinon vous ne pouvez pas lire les fichiers côté serveur après la soumission!

mark.inman
la source
sauf si vous le soumettez avec un websocket ou un ajax
bluejayke
8

Vous pouvez le faire maintenant avec HTML5

En substance, vous utilisez l'attribut multiple sur l'entrée de fichier.

<input type='file' multiple>
Costa
la source
Qu'en est-il du support pour cette chose? Canisuse.com n'a pas les informations.
Hubert OG
Je ne suis pas sûr, j'ai vérifié au même endroit, haha.
Costa
1
FileReader n'a pas de .namepropriété, donc le titre dans votre exemple est toujours undefined: jsfiddle.net/m5jeyeyt/1
vladkras
1

HTML5 a fourni un nouvel attribut multiple pour l'élément d'entrée dont l'attribut type est fichier. Ainsi, vous pouvez sélectionner plusieurs fichiers et IE9 et les versions précédentes ne le prennent pas en charge.

REMARQUE: faites attention au nom de l'élément d'entrée. lorsque vous souhaitez télécharger plusieurs fichiers, vous devez utiliser un tableau et non une chaîne comme valeur de l'attribut de nom.

ex: input type = "file" name = "myPhotos []" multiple = "multiple"

et si vous utilisez php, vous obtiendrez les données dans $ _FILES et utiliserez var_dump ($ _ FILES) et verrez la sortie et le traitement maintenant vous pouvez itérer et faire le reste

Arjun J Gowda
la source
1

C'est facile ...

<input type='file' multiple>
$('#file').on('change',function(){
     _readFileDataUrl(this,function(err,files){
           if(err){return}
           console.log(files)//contains base64 encoded string array holding the 
           image data 
     });
});
var _readFileDataUrl=function(input,callback){
    var len=input.files.length,_files=[],res=[];
    var readFile=function(filePos){
        if(!filePos){
            callback(false,res);
        }else{
            var reader=new FileReader();
            reader.onload=function(e){              
                res.push(e.target.result);
                readFile(_files.shift());
            };
            reader.readAsDataURL(filePos);
        }
    };
    for(var x=0;x<len;x++){
        _files.push(input.files[x]);
    }
    readFile(_files.shift());
};
Francis Thiong'o
la source
5
C'est déjà répondu clairement. Quel est le besoin d'ajouter un exemple javascript?
RightHandedMonkey
parce que c'est sympa?
Thomas Ludewig
0
<form action="" method="post" enctype="multipart/form-data">
<input type="file" multiple name="img[]"/>
<input type="submit">
</form>
<?php
print_r($_FILES['img']['name']);
?>
Anowar Hossain
la source
-2

Copiez et collez ceci dans votre html:

<input type="file" id="files" name="files[]" multiple />
<output id="list"></output>

<script>
function handleFileSelect(evt) {
var files = evt.target.files; // FileList object

// files is a FileList of File objects. List some properties.
var output = [];
for (var i = 0, f; f = files[i]; i++) {
  output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', ') - ',
              f.size, ' bytes, last modified: ',
              f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
              '</li>');
}
document.getElementById('list').innerHTML = '<ul>' + output.join('') + '</ul>';
}

Cela vous vient, à travers moi, de cette page Web: http://www.html5rocks.com/en/tutorials/file/dndfiles/

collyg
la source