Estou construindo um aplicativo da web de arrastar e soltar para fazer upload usando HTML5 e soltando os arquivos em um div e, claro, buscando o objeto dataTransfer, que me dá a FileList .
Agora quero remover alguns dos arquivos, mas não sei como, nem se é possível.
De preferência, gostaria apenas de excluí-los da FileList; Eu não tenho uso para eles. Mas se isso não for possível, devo escrever em cheques no código que interage com a FileList? Isso parece complicado.
javascript
html
drag-and-drop
filelist
Heilemann
fonte
fonte
Respostas:
Se você quiser excluir apenas alguns dos arquivos selecionados: você não pode. O Rascunho de trabalho da API de arquivo ao qual você vinculou contém uma nota:
Lendo um pouco do HTML 5 Working Draft, me deparei com as APIs de elemento comum
input
. Parece que você pode excluir toda a lista de arquivos definindo avalue
propriedade doinput
objeto como uma string vazia, como:BTW, o artigo Usando arquivos de aplicativos da web também pode ser interessante.
fonte
length
é somente leitura, eu acho. Tento excluir um item com emenda, mas falha no Chrome.Esta pergunta já foi marcada como respondida, mas gostaria de compartilhar algumas informações que podem ajudar outras pessoas a usar o FileList.
Seria conveniente tratar um FileList como um array, mas métodos como sort, shift, pop e slice não funcionam. Como outros sugeriram, você pode copiar FileList para um array. No entanto, em vez de usar um loop, há uma solução simples de uma linha para lidar com essa conversão.
Testado OK em FF, Chrome e IE10 +
fonte
Array.from(fileDialog.files)
é mais simplesfileDialog.files = fileBuffer
?Se você está almejando navegadores perenes (Chrome, Firefox, Edge, mas também funciona no Safari 9+) ou pode pagar um polyfill, você pode transformar o FileList em uma matriz usando
Array.from()
desta forma:Então, é fácil lidar com o array de
File
s como qualquer outro array.fonte
fileArray
não controlefileList
.Já que estamos no reino do HTML5, esta é a minha solução. A essência é que você envia os arquivos para um Array em vez de deixá-los em uma FileList e, em seguida, usando o XHR2, envia os arquivos para um objeto FormData. Exemplo abaixo.
fonte
Eu encontrei uma solução muito rápida e curta para isso. Testado em muitos navegadores populares (Chrome, Firefox, Safari);
Primeiro, você deve converter FileList em um Array
para deletar o elemento particular, use este
fonte
event.target.files
qual não está vinculada à entrada, portanto, não pode alterar nada, exceto sua variável local ..Eu sei que esta é uma pergunta antiga, mas ela está bem posicionada nos mecanismos de pesquisa em relação a esse problema.
as propriedades no objeto FileList não podem ser excluídas, mas pelo menos no Firefox elas podem ser alteradas . Minha solução para esse problema foi adicionar uma propriedade
IsValid=true
aos arquivos que passaram na verificação eIsValid=false
aos que não passaram.em seguida, simplesmente percorro a lista para ter certeza de que apenas as propriedades com
IsValid=true
são adicionadas a FormData .fonte
Pode haver uma maneira mais elegante de fazer isso, mas aqui está a minha solução. Com Jquery
Basicamente, você determina o valor da entrada. Clone-o e coloque o clone no lugar do antigo.
fonte
Isso é extemporâneo, mas tive o mesmo problema que resolvi dessa forma. No meu caso, eu estava carregando os arquivos por meio de uma solicitação XMLHttp, então pude postar os dados clonados de FileList por meio da anexação de dados de formulário. A funcionalidade é que você pode arrastar e soltar ou selecionar vários arquivos quantas vezes quiser (selecionar arquivos novamente não redefinirá a FileList clonada), remover qualquer arquivo que desejar da lista de arquivos (clonados) e enviar via xmlhttprequest o que quer que fosse deixou lá. Isso é o que eu fiz. É meu primeiro post aqui, então o código é um pouco confuso. Desculpe. Ah, e eu tive que usar jQuery em vez de $ como era no script do Joomla.
Agora, o html e os estilos para isso. Eu sou um novato, mas tudo isso realmente funcionou para mim e levei um tempo para descobrir.
Os estilos para isso. Eu tive que marcar alguns deles! Importantes para substituir o comportamento do Joomla.
Eu espero que isso ajude.
fonte
Obrigado @Nicholas Anderson simples e direto, aqui está seu código aplicado e trabalhando no meu código usando jquery.
HTML.
CÓDIGO JS
fonte
In vue js:
fonte
Se você tiver a sorte de estar enviando uma solicitação de postagem para o banco de dados com os arquivos e tiver os arquivos que deseja enviar em seu DOM
você pode simplesmente verificar se o arquivo na lista de arquivos está presente em seu DOM e, claro, se não estiver, simplesmente não envie esse elemento para o banco de dados.
fonte
Você pode desejar criar uma matriz e usá-la em vez da lista de arquivos somente leitura.
Depois desse ponto, faça o upload na sua lista em vez de na lista incorporada. Não tenho certeza do contexto em que você está trabalhando, mas estou trabalhando com um plugin jquery que encontrei e o que tive que fazer foi pegar o código-fonte do plugin e colocá-lo na página usando
<script>
tags. Então, acima do código-fonte, adicionei meu array para que ele possa atuar como uma variável global e o plugin possa fazer referência a ele.Depois, foi só trocar as referências.
Eu acho que isso permitiria que você também adicionasse arrastar e soltar novamente, se a lista embutida for somente leitura, então de que outra forma você poderia colocar os arquivos soltos na lista?
:))
fonte
FileList
objeto àmyReadWriteList
variável, ele muda seu tipo deArray
paraFileList
, portanto, esta não é uma solução.Acabei de mudar o tipo de entrada para o texto e de volta para o arquivo: D
fonte