Jak wybrać wiele plików za pomocą <input type = „file”>?

110

Jak wybrać wiele plików za pomocą <input type="file">?

Maska
źródło
Chodzi o javascript i html
Mask
Czy masz na myśli przesyłanie wielu plików za jednym razem (po wybraniu jednego na raz, a następnie kliknięciu przycisku przesyłania)? A może masz na myśli użycie Ctrl + kliknięcie, aby wybrać kilka plików w jednym oknie przeglądarki?
cletus
2
Możesz to zrobić za pomocą HTML5, używając atrybutu wielokrotnego w elemencie wejściowym. <input type = 'file' multiple = ''> Oto świetne skrzypce, które je wykorzystują: jsfiddle.net/0GiS0/Yvgc2
Costa,

Odpowiedzi:

126

Nowa odpowiedź:

W HTML5 możesz dodać multipleatrybut, aby wybrać więcej niż 1 plik.

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

Stara odpowiedź:

Możesz wybrać tylko 1 plik na <input type="file" />. Jeśli chcesz wysłać wiele plików, będziesz musiał użyć wielu tagów wejściowych lub użyć Flasha lub Silverlight.

ZippyV
źródło
7
Gmail używa do tego Flasha
Fabien Ménager
19
Nie od czasu HTML5. Istnieje wiele atrybutów dla pola wejściowego.
Costa,
2
@Costa 20 października 2009 większość przeglądarek nie obsługiwała tej funkcji, a Niavlys już 2 lata temu pokazało rozwiązanie html5.
ZippyV,
2
ta odpowiedź jest starsza niż dinozaury
kliknij „Upvote”
2
ten parametr multiple = "multiple" nie jest przyjazny dla użytkownika, przeciętny użytkownik go nie rozumie, nawet nie wie, co robi "przycisk ctrl" i nie może wybierać plików w różnych folderach.
Jean-Paul,
84

Jest też HTML5 <input type="file" multiple />( specyfikacja ).

Obsługa przeglądarek jest całkiem dobra na komputerach stacjonarnych (po prostu nie jest obsługiwana przez IE 9 i wcześniejsze), mniej dobra na urządzeniach mobilnych, myślę, że trudniej jest ją poprawnie zaimplementować w zależności od platformy i wersji.

Niavlys
źródło
9
Nieobsługiwane w IE9 i wcześniejszych :(
Ashit Vora
7
rozważ dodaniename="files[]"
Wariored
22

Całość powinna wyglądać następująco:

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

Upewnij się, że masz enctype='multipart/form-data'atrybut w swoim <form>tagu lub nie możesz odczytać plików po stronie serwera po przesłaniu!

mark.inman
źródło
chyba że prześlesz go za pomocą websocket lub ajax
prześlesz
8

Możesz to teraz zrobić za pomocą HTML5

Zasadniczo używasz atrybutu wielokrotnego na wejściu pliku.

<input type='file' multiple>
Costa
źródło
A co ze wsparciem w tej sprawie? Canisuse.com nie ma tych informacji.
Hubert OG,
Nie jestem pewien, sprawdziłem to samo miejsce, haha.
Costa
1
FileReader nie ma .namewłaściwości, więc tytuł w Twoim przykładzie to zawsze undefined: jsfiddle.net/m5jeyeyt/1
vladkras
1

HTML5 dostarczył wiele nowych atrybutów dla elementu wejściowego, którego atrybutem typu jest plik. Możesz więc wybrać wiele plików, a IE9 i poprzednie wersje tego nie obsługują.

UWAGA: uważaj na nazwę elementu wejściowego. jeśli chcesz przesłać wiele plików, jako wartość atrybutu name należy użyć tablicy, a nie łańcucha.

np. typ danych wejściowych = "plik" nazwa = "moje zdjęcia []" wiele = "wiele"

a jeśli używasz php to otrzymasz dane w $ _FILES i użyjesz var_dump ($ _ FILES) i zobacz wyjście i wykonaj przetwarzanie Teraz możesz iterować i zrobić resztę

Arjun J Gowda
źródło
1

To łatwe ...

<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
źródło
5
Odpowiedź jest już jasna. Jaka jest potrzeba dodania przykładu javascript?
RightHandedMonkey
1
bo to miłe?
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
źródło
-2

Skopiuj i wklej to do swojego 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>';
}

To przychodzi do Ciebie, poprzez mnie, z tej strony internetowej: http://www.html5rocks.com/en/tutorials/file/dndfiles/

collyg
źródło