Je voudrais restreindre le type de fichier qui peut être choisi dans le sélecteur de fichiers OS natif lorsque l'utilisateur clique sur le bouton Parcourir dans l' <input type="file">
élément en HTML. J'ai le sentiment qu'il est impossible, mais je voudrais savoir s'il est une solution. Je voudrais m'en tenir uniquement au HTML et au JavaScript; pas de Flash s'il vous plaît.
667
Réponses:
À strictement parler, la réponse est non . Un développeur ne peut pas empêcher un utilisateur de télécharger des fichiers de n'importe quel type ou extension.
Mais tout de même, l' attribut accept de
<input type = "file">
peut aider à fournir un filtre dans la boîte de dialogue de sélection de fichier du système d'exploitation. Par exemple,devrait fournir un moyen de filtrer les fichiers autres que .xls ou .xlsx. Bien que le page MDN pour
input
element ait toujours dit qu'elle le supporte, à ma grande surprise, cela n'a pas fonctionné pour moi dans Firefox jusqu'à la version 42. Cela fonctionne dans IE 10+, Edge et Chrome.Donc, pour prendre en charge Firefox plus de 42 ans avec IE 10+, Edge, Chrome et Opera, je suppose qu'il est préférable d'utiliser une liste de types MIME séparés par des virgules:
[ Comportement Edge (EdgeHTML): la liste déroulante du filtre de type de fichier affiche les types de fichiers mentionnés ici, mais ce n'est pas la valeur par défaut dans la liste déroulante. Le filtre par défaut est
All files (*)
.]Vous pouvez également utiliser des astérisques dans les types MIME. Par exemple:
Le W3C recommande aux auteurs de spécifier à la fois les types MIME et les extensions correspondantes dans l'
accept
attribut. Donc, la meilleure approche est:JSFiddle de la même: ici .
Référence: Liste des types MIME
IMPORTANT: L' utilisation de l'
accept
attribut ne fournit qu'un moyen de filtrage dans les fichiers des types qui vous intéressent. Les navigateurs permettent toujours aux utilisateurs de choisir des fichiers de tout type. D' autres contrôles (côté client) doit être fait ( en utilisant JavaScript, une façon serait ce ), et certainement les types de fichiers doivent être vérifiés sur le serveur , en utilisant une combinaison de type MIME utilisant à la fois l'extension de fichier et sa signature binaire ( ASP .NET , PHP , Ruby , Java ). Vous pouvez également faire référence à ces tableaux pour les types de fichiers et leurs nombres magiques, pour effectuer une vérification côté serveur plus robuste.Voici trois bonnes lectures sur les téléchargements de fichiers et la sécurité.
EDIT: Peut - être que la vérification du type de fichier à l'aide de sa signature binaire peut également être effectuée côté client à l'aide de JavaScript (plutôt que simplement en regardant l'extension) à l'aide de l'API de fichier HTML5, mais tout de même, le fichier doit être vérifié sur le serveur, car un utilisateur malveillant sera toujours en mesure de télécharger des fichiers en faisant une demande HTTP personnalisée.
la source
accept
cela ne fonctionne toujours pas dans Edge: stackoverflow.com/questions/31875617/… . Plus de détails ici: wpdev.uservoice.com/forums/257854-microsoft-edge-developer/…exclude="exe"
. ¯_ (ツ) _ / ¯Il existe l'attribut accept pour la balise d'entrée. Cependant, il n'est en aucun cas fiable. Les navigateurs la traitent très probablement comme une "suggestion", ce qui signifie que l'utilisateur aura, selon le gestionnaire de fichiers également, une présélection qui n'affiche que les types souhaités. Ils peuvent toujours choisir "tous les fichiers" et télécharger n'importe quel fichier de leur choix.
Par exemple:
En savoir plus dans le spécification HTML5
Gardez à l'esprit qu'il ne doit être utilisé que comme "aide" pour que l'utilisateur puisse trouver les bons fichiers. Chaque utilisateur peut envoyer toute demande qu'il souhaite à votre serveur. Vous devez toujours tout valider côté serveur.
La réponse est donc: non, vous ne pouvez pas restreindre , mais vous pouvez définir une présélection mais vous ne pouvez pas fier.
Alternativement ou en plus, vous pouvez faire quelque chose de similaire en vérifiant le nom de fichier (valeur du champ de saisie) avec JavaScript, mais cela n'a aucun sens car il n'offre aucune protection et ne facilite pas non plus la sélection pour l'utilisateur. Cela trompe potentiellement un webmaster en lui faisant croire qu'il est protégé et ouvre une faille de sécurité. Cela peut être pénible pour les utilisateurs qui ont des extensions de fichier alternatives (par exemple jpeg au lieu de jpg), en majuscules ou aucune extension de fichier (comme cela est courant sur les systèmes Linux).
la source
Vous pouvez utiliser l'
change
événement pour surveiller ce que l'utilisateur sélectionne et l'informer à ce stade que le fichier n'est pas acceptable. Il ne limite pas la liste réelle des fichiers affichés, mais c'est le plus proche que vous pouvez faire côté client, en plus de l'accept
attribut mal pris en charge .JSFiddle
la source
Oui, tu as raison. C'est impossible avec HTML. L'utilisateur pourra choisir le fichier qu'il souhaite.
Vous pouvez écrire un morceau de JavaScript code pour éviter de soumettre un fichier basé sur son extension. Mais gardez à l'esprit que cela n'empêchera en aucun cas un utilisateur malveillant de soumettre n'importe quel fichier qu'il souhaite vraiment.
Quelque chose comme:
Code HTML:
la source
Techniquement, vous pouvez spécifier l'
accept
attribut (alternative en html5 ) sur l'input
élément, mais il n'est pas correctement pris en charge.la source
Utiliser une
input
balise avec unaccept
attributCliquez ici pour le dernier tableau de compatibilité du navigateur
Démo en direct ici
Pour sélectionner uniquement les fichiers image, vous pouvez utiliser ceci
accept="image/*"
Démo en direct ici
Seuls gif, jpg et png seront affichés, capture d'écran de Chrome version 44
la source
accept="image/*"
, il dit "Fichiers image" au lieu de "Fichiers personnalisés" dans le sélecteur de fichiers, ce qui est agréable pour l'utilisateur final.Je sais que c'est un peu tard.
la source
Vous pouvez réellement le faire avec javascript mais rappelez-vous que js est côté client, donc vous devriez en fait "avertir les utilisateurs" du type de fichiers qu'ils peuvent télécharger, si vous voulez ÉVITER (restreindre ou limiter comme vous l'avez dit) certains types de fichiers que vous DEVEZ faites-le côté serveur.
Regardez ce tut de base si vous souhaitez commencer avec la validation côté serveur. Pour l'ensemble du tutoriel, visitez cette page .
Bonne chance!
la source
Comme mentionné dans les réponses précédentes, nous ne pouvons pas restreindre l'utilisateur à sélectionner des fichiers uniquement pour des formats de fichiers donnés. Mais c'est vraiment pratique d'utiliser la balise accept sur l'attribut file en html.
Quant à la validation, nous devons le faire côté serveur. Nous pouvons également le faire côté client en js mais ce n'est pas une solution infaillible. Nous devons valider côté serveur.
Pour ces exigences, je préfère vraiment le cadre de développement d'applications Web Java struts2. Avec sa fonction de téléchargement de fichiers intégrée, le téléchargement de fichiers vers des applications Web basées sur struts2 est un jeu d'enfant. Il suffit de mentionner les formats de fichiers que nous aimerions accepter dans notre application et tout le reste est pris en charge par le cœur du framework lui-même. Vous pouvez le vérifier sur le site officiel de struts.
la source
Je peux suggérer ce qui suit:
Si vous devez obliger l'utilisateur à sélectionner l'un des fichiers image par défaut, utilisez accept = "image / *"
<input type="file" accept="image/*" />
si vous souhaitez vous limiter à des types d'images spécifiques, utilisez accept = "image / bmp, image / jpeg, image / png"
<input type="file" accept="image/bmp, image/jpeg, image/png" />
si vous souhaitez vous limiter à des types spécifiques, utilisez accept = ". bmp, .doc, .pdf"
<input type="file" accept=".bmp, .doc, .pdf" />
Vous ne pouvez pas restreindre l'utilisateur à changer le fichier Filer à tous les fichiers, donc toujours valider le type de fichier dans le script et le serveur
la source