Je construis une application Web glisser-déposer pour télécharger en utilisant HTML5, et je dépose les fichiers sur un div et bien sûr récupère l'objet dataTransfer, ce qui me donne la FileList .
Maintenant, je veux supprimer certains fichiers, mais je ne sais pas comment ou si c'est même possible.
De préférence, je voudrais simplement les supprimer de la FileList; Je n'ai aucune utilité pour eux. Mais si ce n'est pas possible, dois-je plutôt écrire des chèques dans un code qui interagit avec FileList? Cela semble fastidieux.
javascript
html
drag-and-drop
filelist
Heilemann
la source
la source
Réponses:
Si vous ne souhaitez supprimer que plusieurs des fichiers sélectionnés: vous ne pouvez pas. Le brouillon de travail de l'API de fichier auquel vous avez lié contient une note:
En lisant un peu le brouillon de travail HTML 5, je suis tombé sur les API des éléments communs
input
. Il semble que vous pouvez supprimer toute la liste de fichiers en définissant lavalue
propriété de l'input
objet sur une chaîne vide, comme:BTW, l'article Utilisation de fichiers à partir d'applications Web pourrait également être intéressant.
la source
length
est en lecture seule, je pense. J'essaie de supprimer un élément avec une épissure, cela échoue dans Chrome.Cette question a déjà été marquée comme répondue, mais j'aimerais partager certaines informations qui pourraient aider d'autres personnes à utiliser FileList.
Il serait pratique de traiter une FileList comme un tableau, mais des méthodes telles que sort, shift, pop et slice ne fonctionnent pas. Comme d'autres l'ont suggéré, vous pouvez copier la FileList dans un tableau. Cependant, plutôt que d'utiliser une boucle, il existe une solution simple en une ligne pour gérer cette conversion.
Testé OK dans FF, Chrome et IE10 +
la source
Array.from(fileDialog.files)
is simplerfileDialog.files = fileBuffer
?Si vous ciblez des navigateurs à feuilles persistantes (Chrome, Firefox, Edge, mais fonctionne également dans Safari 9+) ou si vous pouvez vous permettre un polyfill, vous pouvez transformer la FileList en un tableau en utilisant
Array.from()
comme ceci:Ensuite, il est facile de gérer le tableau de
File
s comme n'importe quel autre tableau.la source
fileArray
nonfileList
.Puisque nous sommes dans le domaine HTML5, c'est ma solution. L'essentiel est que vous poussez les fichiers vers un tableau au lieu de les laisser dans une FileList, puis en utilisant XHR2, vous poussez les fichiers vers un objet FormData. Exemple ci-dessous.
la source
J'ai trouvé une solution de contournement très rapide et courte pour cela. Testé dans de nombreux navigateurs populaires (Chrome, Firefox, Safari);
Tout d'abord, vous devez convertir FileList en un tableau
pour supprimer l'élément particulier, utilisez ceci
la source
event.target.files
laquelle n'est pas liée à l'entrée, donc elle ne peut rien changer sauf votre variable locale ..Je sais que c'est une vieille question, mais elle est bien classée dans les moteurs de recherche en ce qui concerne ce problème.
les propriétés de l' objet FileList ne peuvent pas être supprimées mais au moins sur Firefox, elles peuvent être modifiées . Ma solution de contournement à ce problème consistait à ajouter une propriété
IsValid=true
aux fichiers qui ont passé la vérification etIsValid=false
à ceux qui ne l'ont pas été.puis je viens de parcourir la liste pour m'assurer que seules les propriétés avec
IsValid=true
sont ajoutées à FormData .la source
Il y a peut-être une façon plus élégante de le faire, mais voici ma solution. Avec Jquery
En gros, vous calez la valeur de l'entrée. Clonez-le et mettez le clone à la place de l'ancien.
la source
C'est improvisé, mais j'ai eu le même problème que j'ai résolu de cette façon. Dans mon cas, je téléchargeais les fichiers via une requête XMLHttp, j'ai donc pu publier les données clonées FileList via l'ajout de formdata. La fonctionnalité est que vous pouvez faire glisser et déposer ou sélectionner plusieurs fichiers autant de fois que vous le souhaitez (la sélection de fichiers à nouveau ne réinitialisera pas la FileList clonée), supprimez tout fichier de votre choix de la liste de fichiers (clonée) et soumettez via xmlhttprequest ce qui était laissé là. C'est ce que j'ai fait. C'est mon premier message ici, donc le code est un peu compliqué. Désolé. Ah, et j'ai dû utiliser jQuery au lieu de $ comme c'était le cas dans le script Joomla.
Maintenant, le html et les styles pour cela. Je suis assez novice mais tout cela a fonctionné pour moi et il m'a fallu un certain temps pour le comprendre.
Les styles pour ça. J'ai dû en marquer certains! Important pour remplacer le comportement de Joomla.
J'espère que ça aide.
la source
Merci @Nicholas Anderson simple et direct, voici votre code appliqué et travaillant sur mon code en utilisant jquery.
HTML.
CODE JS
la source
En vue js:
la source
Si vous avez la chance d'envoyer une demande de publication à la base de données avec les fichiers et que vous avez les fichiers que vous souhaitez envoyer dans votre DOM
vous pouvez simplement vérifier si le fichier de la liste de fichiers est présent dans votre DOM, et bien sûr, si ce n'est pas le cas, n'envoyez pas cet élément à de DB.
la source
Vous souhaiterez peut-être créer un tableau et l'utiliser à la place de la liste de fichiers en lecture seule.
Après ce point, effectuez votre téléchargement par rapport à votre liste au lieu de la liste intégrée. Je ne suis pas sûr du contexte dans lequel vous travaillez mais je travaille avec un plugin jquery que j'ai trouvé et ce que je devais faire était de prendre la source du plugin et de le mettre dans la page en utilisant des
<script>
balises. Ensuite, au-dessus de la source, j'ai ajouté mon tableau afin qu'il puisse agir comme une variable globale et que le plugin puisse le référencer.Ensuite, il s'agissait simplement d'échanger les références.
Je pense que cela vous permettrait également d'ajouter le glisser-déposer, si la liste intégrée est en lecture seule, comment pourriez-vous obtenir les fichiers déposés dans la liste?
:))
la source
FileList
objet à lamyReadWriteList
variable, il change son type deArray
àFileList
, donc ce n'est pas une solution.Je change juste le type d'entrée au texte et reviens au fichier: D
la source