De nos jours, nous pouvons faire glisser et déposer des fichiers dans un conteneur spécial et les télécharger avec XHR 2. Plusieurs à la fois. Avec des barres de progression en direct, etc. Trucs très cool.Exemple ici.
Mais parfois, nous ne voulons pas autant de fraîcheur. Ce que je voudrais est de déplacer les fichiers - plusieurs à la fois - dans une entrée de fichier standard HTML : <input type=file multiple>
.
Est-ce possible? Existe-t-il un moyen de «remplir» l'entrée de fichier avec les bons noms de fichiers (?) À partir du fichier drop? (Les chemins de fichiers complets ne sont pas disponibles pour des raisons de sécurité du système de fichiers.)
Pourquoi? Parce que j'aimerais soumettre un formulaire normal. Pour tous les navigateurs et tous les appareils. Le glisser-déposer n'est qu'une amélioration progressive pour améliorer et simplifier l'UX. Le formulaire standard avec entrée de fichier standard (+multiple
attribut) sera là. Je voudrais ajouter l'amélioration HTML5.
modifier
Je sais que dans certains navigateurs, vous pouvez parfois (presque toujours) déposer des fichiers dans l'entrée de fichier elle-même. Je sais que Chrome le fait généralement, mais parfois il échoue et charge ensuite le fichier dans la page actuelle (un gros échec si vous remplissez un formulaire). Je veux le tromper et le protéger du navigateur.
input type="file" multiple
fonctionner correctement dans SafariRéponses:
Ce qui suit fonctionne dans Chrome et FF, mais je n'ai pas encore trouvé de solution qui couvre également IE10 +:
Vous voudrez probablement utiliser
addEventListener
ou jQuery (etc.) pour enregistrer vos gestionnaires evt - c'est juste pour des raisons de concision.la source
MSIE
,Trident/
(IE11) etEdge/
(IE12) ...fileInput.files = evt.dataTransfer.files;
. Safari et Chrome fonctionnent cependant tous les deux correctement.J'ai fait une solution pour cela.
Afficher l'extrait de code
La fonctionnalité de glisser-déposer de cette méthode ne fonctionne qu'avec Chrome, Firefox et Safari. (Je ne sais pas si cela fonctionne avec IE10), mais pour les autres navigateurs, le bouton "Ou cliquez ici" fonctionne très bien.
Le champ de saisie suit simplement votre souris lorsque vous faites glisser un fichier sur une zone, et j'ai également ajouté un bouton.
Opacité sans commentaire: 0; l'entrée de fichier n'est visible que pour que vous puissiez voir ce qui se passe.
la source
C'est la manière HTML5 "DTHML" de le faire. Entrée de forme normale (qui EST lue uniquement comme l'a souligné Ricardo Tomasi). Ensuite, si un fichier est glissé, il est joint au formulaire. Cela nécessitera une modification de la page d'action pour accepter le fichier téléchargé de cette façon.
C'est encore plus efficace si vous pouvez faire de la fenêtre entière une zone de dépôt, voir Comment détecter un événement de glisser HTML5 entrant et sortant de la fenêtre, comme le fait Gmail?
la source
input type=file
.value
propriété avec le fichier le plus récent, chaque fois que vous parcourez la boucle antérieure?la source
En théorie, vous pouvez ajouter un élément superposant le
<input/>
, puis utiliser sondrop
événement pour capturer les fichiers (à l'aide de l'API File) et les transmettre aufiles
tableau d' entrée .Sauf qu'une entrée de fichier est en lecture seule . C'est un vieux problème.
Vous pouvez cependant contourner complètement le contrôle de formulaire et télécharger via XHR (pas sûr de la prise en charge de cela):
Vous pouvez également utiliser un élément dans la zone environnante pour annuler l'événement de dépôt dans Chrome et empêcher le comportement par défaut de chargement du fichier.
Déposer plusieurs fichiers sur l'entrée fonctionne déjà dans Safari et Firefox.
la source
C'est ce que je suis sorti.
Utilisation de Jquery et Html. Cela l'ajoutera aux fichiers d'insertion.
la source
Pour une solution CSS uniquement:
Modifié à partir de https://codepen.io/Scribblerockerz/pen/qdWzJw
la source
Je sais que certaines astuces fonctionnent dans Chrome:
Lorsque vous déposez des fichiers dans la zone de dépôt, vous obtenez un
dataTransfer.files
objet, c'est-à-dire unFileList
type d'objet, qui contient tous les fichiers que vous avez glissés. Pendant ce temps, l'<input type="file" />
élément a la propriétéfiles
, c'est-à-dire le mêmeFileList
objet de type.Ainsi, vous pouvez simplement affecter l'
dataTransfer.files
objet à lainput.files
propriété.la source
input.files
ne peut pas = (Pour tous ceux qui cherchent à faire cela en 2018, j'ai une solution bien meilleure et plus simple que toutes les anciennes choses publiées ici. Vous pouvez créer une jolie boîte de glisser-déposer avec juste du HTML, du JavaScript et du CSS.
(Fonctionne uniquement dans Chrome jusqu'à présent)
Commençons par le HTML.
Ensuite, nous aborderons le style.
Une fois que vous avez fait cela, cela semble déjà bien. Mais j'imagine que vous aimeriez voir quel fichier vous avez effectivement téléchargé, donc nous allons faire du JavaScript. Rappelez-vous cette plage de valeurs pfp? C'est là que nous imprimerons le nom du fichier.
Et c'est tout.
la source
Excellent travail de @BjarkeCK. J'ai apporté quelques modifications à son travail, pour l'utiliser comme méthode dans jquery:
Violon de travail
la source
Quelques années plus tard, j'ai construit cette bibliothèque pour déposer des fichiers dans n'importe quel élément HTML.
Vous pouvez l'utiliser comme
la source
Ce que vous pouvez faire, c'est afficher une entrée de fichier et la superposer avec votre zone de dépôt transparente, en prenant soin d'utiliser un nom comme
file[1]
. {Assurez-vous d'avoir leenctype="multipart/form-data"
intérieur de votre balise FORM.}Ensuite, demandez à la zone de dépôt de gérer les fichiers supplémentaires en créant dynamiquement plus d'entrées de fichier pour les fichiers 2..number_of_files, assurez-vous d'utiliser le même nom de base, en remplissant correctement l'attribut valeur.
Enfin (front-end) soumettez le formulaire.
Tout ce qui est nécessaire pour gérer cette méthode est de modifier votre procédure pour gérer un tableau de fichiers.
la source
multiple
attribut de nos jours. Pas besoin de plus d'une entrée de fichier. Ce n'est pas le problème cependant. Comment obtenir lesFile
objets dans l'entrée de fichier? Je pense que cela nécessite un exemple de code ...files
propriété), mais je n'ai pas réussi dans IE - avez-vous eu de la chance?