Como selecionar vários arquivos com <input type = “file”>?

110

Como selecionar vários arquivos com <input type="file">?

mascarar
fonte
É sobre javascript e html
Máscara de
Você quer dizer fazer upload de vários arquivos de uma vez (quando você seleciona um de cada vez e clica em upload)? Ou você quer dizer usar ctrl + clique para selecionar vários arquivos em uma janela do navegador?
cletus
2
Você pode fazer isso com HTML5 usando o atributo multiple no elemento input. <input type = 'file' multiple = ''> Aqui está um ótimo violino que o utiliza: jsfiddle.net/0GiS0/Yvgc2
Costa

Respostas:

126

Nova resposta:

Em HTML5, você pode adicionar o multipleatributo para selecionar mais de 1 arquivo.

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

Resposta antiga:

Você só pode selecionar 1 arquivo por <input type="file" />. Se você quiser enviar vários arquivos, terá que usar várias tags de entrada ou usar Flash ou Silverlight.

ZippyV
fonte
7
O Gmail usa Flash para fazer isso
Fabien Ménager,
19
Não desde HTML5. Há um atributo múltiplo para o campo de entrada.
Costa
2
@Costa No dia 20 de outubro de 2009, a maioria dos navegadores não suportava esse recurso e a Niavlys já mostrava a solução html5 há 2 anos.
ZippyV
2
esta resposta é mais antiga do que os dinossauros
Click Upvote
2
este múltiplo = "múltiplo" não é amigável, o usuário médio não o entende, nem mesmo sabe o que um "botão ctrl" faz e não pode selecionar arquivos em pastas diferentes.
Jean-Paul
84

Também existe HTML5 <input type="file" multiple />( especificação ).

O suporte do navegador é muito bom no desktop (apenas não é compatível com o IE 9 e anteriores), menos bom no celular, acho que é mais difícil de implementar corretamente dependendo da plataforma e da versão.

Niavlys
fonte
9
Não compatível com IE9 e anteriores :(
Ashit Vora
7
considere adicionarname="files[]"
Wariored em
22

A coisa toda deve ser semelhante a:

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

Certifique-se de ter o enctype='multipart/form-data'atributo em sua <form>tag, ou você não poderá ler os arquivos no servidor após o envio!

mark.inman
fonte
a menos que você o envie com um websocket ou ajax
bluejayke
8

Você pode fazer isso agora com HTML5

Em essência, você usa o atributo múltiplo na entrada do arquivo.

<input type='file' multiple>
Costa
fonte
Que tal suporte para isso? Canisuse.com não tem a informação.
Hubert OG de
Não tenho certeza, verifiquei o mesmo lugar, haha.
Costa
1
FileReader não tem .namepropriedade, então o título em seu exemplo é sempre undefined: jsfiddle.net/m5jeyeyt/1
vladkras
1

HTML5 forneceu um novo atributo múltiplo para o elemento de entrada cujo atributo type é file. Portanto, você pode selecionar vários arquivos e o IE9 e as versões anteriores não suportam isso.

NOTA: cuidado com o nome do elemento de entrada. quando você deseja fazer upload de vários arquivos, deve usar array e não string como o valor do atributo name.

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

e se você estiver usando php, você obterá os dados em $ _FILES e usará var_dump ($ _ FILES) e verá a saída e o processamento Agora você pode iterar e fazer o resto

Arjun J Gowda
fonte
1

Isso é fácil ...

<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
fonte
5
Isso já foi respondido com clareza. Qual é a necessidade de adicionar um exemplo de javascript?
RightHandedMonkey
porque é bom?
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
fonte
-2

Copie e cole em seu 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>';
}

Isso chega a você, por meu intermédio, a partir desta página da web: http://www.html5rocks.com/en/tutorials/file/dndfiles/

collyg
fonte