Atualmente, podemos arrastar e soltar arquivos em um contêiner especial e carregá-los com o XHR 2. Muitos de cada vez. Com barras de progresso ao vivo, etc. Coisas muito legais. Exemplo aqui.
Mas às vezes não queremos tanta frescura. O que eu gostaria é para arquivos de drag & drop - muitos de cada vez - em uma entrada de arquivo HTML padrão : <input type=file multiple>
.
Isso é possível? Existe alguma maneira de 'preencher' a entrada do arquivo com os nomes de arquivos corretos (?) Na lista de opções? (Os caminhos de arquivo completos não estão disponíveis por razões de segurança do sistema de arquivos.)
Por quê? Porque eu gostaria de enviar um formulário normal. Para todos os navegadores e todos os dispositivos. O arrastar e soltar é apenas um aprimoramento progressivo para aprimorar e simplificar o UX. O formulário padrão com entrada de arquivo padrão ( multiple
atributo + ) estará lá. Eu gostaria de adicionar o aprimoramento do HTML5.
edit
Eu sei que em alguns navegadores você pode, às vezes (quase sempre) soltar arquivos na própria entrada do arquivo. Eu sei que o Chrome geralmente faz isso, mas às vezes falha e carrega o arquivo na página atual (uma grande falha se você estiver preenchendo um formulário). Eu quero enganar e à prova de navegador.
fonte
input type="file" multiple
obras bem em SafariRespostas:
O seguinte funciona no Chrome e no FF, mas ainda não encontrei uma solução que cubra o IE10 +:
Você provavelmente desejará usar o
addEventListener
jQuery (etc.) para registrar seus manipuladores evt - isso é apenas por uma questão de brevidade.fonte
MSIE
,Trident/
(IE11) eEdge/
(IE12) ...fileInput.files = evt.dataTransfer.files;
. Safari e Chrome, no entanto, ambos funcionam bem.Eu fiz uma solução para isso.
Mostrar snippet de código
A funcionalidade de arrastar e soltar para esse método funciona apenas com Chrome, Firefox e Safari. (Não sei se funciona com o IE10), mas para outros navegadores, o botão "Ou clique aqui" funciona bem.
O campo de entrada simplesmente segue o mouse ao arrastar um arquivo sobre uma área, e eu adicionei um botão também ..
Opacidade não comentada: 0; a entrada do arquivo é visível apenas para que você possa ver o que está acontecendo.
fonte
Esta é a maneira HTML5 "DTHML" de fazer isso. Entrada de formulário normal (que é lida apenas como Ricardo Tomasi apontou). Se um arquivo for arrastado, ele será anexado ao formulário. Isso exigirá modificação da página de ação para aceitar o arquivo enviado desta maneira.
É ainda mais importante se você pode tornar a janela inteira uma zona de soltar, consulte Como detecto um evento de arrastar HTML5 entrando e saindo da janela, como o Gmail?
fonte
input type=file
.value
propriedade com o arquivo mais recente, toda vez que itera pelo loop frontal?fonte
Em teoria, você pode adicionar um elemento sobrepondo-o
<input/>
e, em seguida, usá-lodrop
para capturar os arquivos (usando a API de arquivos) e passá-los para afiles
matriz de entrada .Exceto que uma entrada de arquivo é somente leitura . Este é um problema antigo.
No entanto, você pode ignorar completamente o controle de formulário e fazer o upload via XHR (não tem certeza sobre o suporte para isso):
Você também pode usar um elemento na área circundante para cancelar o evento de queda no Chrome e impedir o comportamento padrão de carregar o arquivo.
Soltar vários arquivos sobre a entrada já funciona no Safari e Firefox.
fonte
Foi com isso que eu saí.
Usando Jquery e Html. Isso o adicionará aos arquivos de inserção.
fonte
Para uma solução apenas CSS:
Modificado de https://codepen.io/Scribblerockerz/pen/qdWzJw
fonte
Eu sei que alguns truques funcionam no Chrome:
Ao soltar arquivos na zona de soltar, você obtém um
dataTransfer.files
objeto, que é umFileList
tipo de objeto, que contém todos os arquivos que você arrastou. Enquanto isso, o<input type="file" />
elemento tem a propriedadefiles
, que é o mesmoFileList
objeto de tipo.Portanto, você pode simplesmente atribuir o
dataTransfer.files
objeto àinput.files
propriedadefonte
input.files
não posso = (Para quem quer fazer isso em 2018, tenho uma solução muito melhor e mais simples do que todas as coisas antigas postadas aqui. Você pode criar uma bela caixa de arrastar e soltar com apenas baunilha HTML, JavaScript e CSS.
(Funciona apenas no Chrome até o momento)
Vamos começar com o HTML.
Então, vamos chegar ao estilo.
Depois de fazer isso, ele já parece bem. Mas eu imagino que você gostaria de ver qual arquivo você carregou completamente, então vamos fazer um pouco de JavaScript. Lembra-se do período de valor pfp? É aí que imprimiremos o nome do arquivo.
E é isso.
fonte
Trabalho impressionante por @BjarkeCK. Fiz algumas modificações no seu trabalho, para usá-lo como método no jquery:
Violino de trabalho
fonte
Poucos anos depois, construí esta biblioteca para soltar arquivos em qualquer elemento HTML.
Você pode usá-lo como
fonte
O que você pode fazer é exibir uma entrada de arquivo e cobri-la com sua área de soltar transparente, tomando cuidado para usar um nome como
file[1]
. {Certifique-se de terenctype="multipart/form-data"
dentro da sua etiqueta FORM.}Em seguida, faça com que a área de descarte lide com os arquivos extras, criando dinamicamente mais entradas de arquivos para os arquivos 2 .. número_de_arquivos, certifique-se de usar o mesmo nome base, preenchendo o atributo de valor adequadamente.
Por fim (front-end), envie o formulário.
Tudo o que é necessário para lidar com esse método é alterar seu procedimento para lidar com uma matriz de arquivos.
fonte
multiple
atributo atualmente. Não há necessidade de mais de 1 entrada de arquivo. Essa não é a questão. Como obtenho osFile
objetos na entrada do arquivo? Eu estou pensando que isso requer algum exemplo de código ...files
propriedade), mas eu não consegui no IE - você teve alguma sorte?