web-dev-qa-db-fra.com

L'entrée de fichier attribut 'accepter' - est-ce utile?

Implémenter un téléchargement de fichier sous html est assez simple, mais je viens de remarquer qu’il existe un attribut 'accept' qui peut être ajouté à la balise <input type="file" ...>.

Cet attribut est-il utile pour limiter le téléchargement de fichiers aux images, etc.? Quelle est la meilleure façon de l'utiliser?

Sinon, existe-t-il un moyen de limiter les types de fichier, de préférence dans la boîte de dialogue de fichier, pour une balise d'entrée de fichier html?

318
Darren Oster

L'attribut accept est incroyablement utile. Pour les navigateurs, il est bon de n’afficher que les fichiers autorisés pour le input actuel. Bien qu'il puisse généralement être remplacé par les utilisateurs, il permet par défaut de limiter les résultats. Ainsi, ils peuvent obtenir exactement ce qu'ils recherchent sans avoir à parcourir une centaine de types de fichiers différents.

Usage

Remarque: Ces exemples ont été écrits en fonction de la spécification actuelle et peuvent fonctionne pas dans tous les navigateurs. La spécification peut également changer à l'avenir, ce qui pourrait casser ces exemples.

h1 { font-size: 1em; margin:1em 0; }
h1 ~ h1 { border-top: 1px solid #ccc; padding-top: 1em; }
<h1>Match all image files (image/*)</h1>
<p><label>image/* <input type="file" accept="image/*"></label></p>

<h1>Match all video files (video/*)</h1>
<p><label>video/* <input type="file" accept="video/*"></label></p>

<h1>Match all audio files (audio/*)</h1>
<p><label>audio/* <input type="file" accept="audio/*"></label></p>

<h1>Match all image files (image/*) and files with the extension ".someext"</h1>
<p><label>.someext,image/* <input type="file" accept=".someext,image/*"></label></p>

<h1>Match all image files (image/*) and video files (video/*)</h1>
<p><label>image/*,video/* <input type="file" accept="image/*,video/*"></label></p>

A partir de la spécification HTML ( source )

L'attribut accept peut être spécifié pour fournir aux agents utilisateurs un indice sur les types de fichiers acceptés.

Si spécifié, l'attribut doit consister en un ensemble de jetons séparés par des virgules , chacun d'entre eux devant être une correspondance non sensible à la casse pour l'un des éléments suivants:

La chaîne audio/*

  • Indique que les fichiers sonores sont acceptés.

La chaîne video/*

  • Indique que les fichiers vidéo sont acceptés.

La chaîne image/*

  • Indique que les fichiers image sont acceptés.

A type MIME valide sans paramètre

  • Indique que les fichiers du type spécifié sont acceptés.

Une chaîne dont le premier caractère est un caractère U + 002E FULL STOP (.)

  • Indique que les fichiers portant l'extension spécifiée sont acceptés.
413
0b10011

Oui, il est extrêmement utile dans les navigateurs qui le prennent en charge, mais la "limitation" est un moyen pratique pour les utilisateurs (afin qu'ils ne soient pas submergés de fichiers non pertinents) plutôt que comme un moyen de les empêcher de télécharger des éléments que vous ne souhaitez pas télécharger. Téléchargement.

Il est soutenu dans

  • Chrome 16 +
  • Safari 6 +
  • Firefox 9 +
  • IE 10 +
  • Opera 11 +

Voici ne liste de types de conten que vous pouvez utiliser avec, suivi des extensions de fichier correspondantes (bien que vous puissiez bien sûr utiliser n'importe quelle extension de fichier):

application/envoy   evy
application/fractals    fif
application/futuresplash    spl
application/hta hta
application/internet-property-stream    acx
application/mac-binhex40    hqx
application/msword  doc
application/msword  dot
application/octet-stream    *
application/octet-stream    bin
application/octet-stream    class
application/octet-stream    dms
application/octet-stream    exe
application/octet-stream    lha
application/octet-stream    lzh
application/oda oda
application/olescript   axs
application/pdf pdf
application/pics-rules  prf
application/pkcs10  p10
application/pkix-crl    crl
application/postscript  ai
application/postscript  eps
application/postscript  ps
application/rtf rtf
application/set-payment-initiation  setpay
application/set-registration-initiation setreg
application/vnd.ms-Excel    xla
application/vnd.ms-Excel    xlc
application/vnd.ms-Excel    xlm
application/vnd.ms-Excel    xls
application/vnd.ms-Excel    xlt
application/vnd.ms-Excel    xlw
application/vnd.ms-Outlook  msg
application/vnd.ms-pkicertstore sst
application/vnd.ms-pkiseccat    cat
application/vnd.ms-pkistl   stl
application/vnd.ms-PowerPoint   pot
application/vnd.ms-PowerPoint   pps
application/vnd.ms-PowerPoint   ppt
application/vnd.ms-project  mpp
application/vnd.ms-works    wcm
application/vnd.ms-works    wdb
application/vnd.ms-works    wks
application/vnd.ms-works    wps
application/winhlp  hlp
application/x-bcpio bcpio
application/x-cdf   cdf
application/x-compress  z
application/x-compressed    tgz
application/x-cpio  cpio
application/x-csh   csh
application/x-director  dcr
application/x-director  dir
application/x-director  dxr
application/x-dvi   dvi
application/x-gtar  gtar
application/x-gzip  gz
application/x-hdf   hdf
application/x-internet-signup   ins
application/x-internet-signup   isp
application/x-iphone    iii
application/x-javascript    js
application/x-latex latex
application/x-msaccess  mdb
application/x-mscardfile    crd
application/x-msclip    clp
application/x-msdownload    dll
application/x-msmediaview   m13
application/x-msmediaview   m14
application/x-msmediaview   mvb
application/x-msmetafile    wmf
application/x-msmoney   mny
application/x-mspublisher   pub
application/x-msschedule    scd
application/x-msterminal    trm
application/x-mswrite   wri
application/x-netcdf    cdf
application/x-netcdf    nc
application/x-perfmon   pma
application/x-perfmon   pmc
application/x-perfmon   pml
application/x-perfmon   pmr
application/x-perfmon   pmw
application/x-pkcs12    p12
application/x-pkcs12    pfx
application/x-pkcs7-certificates    p7b
application/x-pkcs7-certificates    spc
application/x-pkcs7-certreqresp p7r
application/x-pkcs7-mime    p7c
application/x-pkcs7-mime    p7m
application/x-pkcs7-signature   p7s
application/x-sh    sh
application/x-shar  shar
application/x-shockwave-flash   swf
application/x-stuffit   sit
application/x-sv4cpio   sv4cpio
application/x-sv4crc    sv4crc
application/x-tar   tar
application/x-tcl   tcl
application/x-tex   tex
application/x-texinfo   texi
application/x-texinfo   texinfo
application/x-troff roff
application/x-troff t
application/x-troff tr
application/x-troff-man man
application/x-troff-me  me
application/x-troff-ms  ms
application/x-ustar ustar
application/x-wais-source   src
application/x-x509-ca-cert  cer
application/x-x509-ca-cert  crt
application/x-x509-ca-cert  der
application/ynd.ms-pkipko   pko
application/Zip zip
audio/basic au
audio/basic snd
audio/mid   mid
audio/mid   rmi
audio/mpeg  mp3
audio/x-aiff    aif
audio/x-aiff    aifc
audio/x-aiff    aiff
audio/x-mpegurl m3u
audio/x-pn-realaudio    ra
audio/x-pn-realaudio    ram
audio/x-wav wav
image/bmp   bmp
image/cis-cod   cod
image/gif   gif
image/ief   ief
image/jpeg  jpe
image/jpeg  jpeg
image/jpeg  jpg
image/pipeg jfif
image/svg+xml   svg
image/tiff  tif
image/tiff  tiff
image/x-cmu-raster  ras
image/x-cmx cmx
image/x-icon    ico
image/x-portable-anymap pnm
image/x-portable-bitmap pbm
image/x-portable-graymap    pgm
image/x-portable-pixmap ppm
image/x-rgb rgb
image/x-xbitmap xbm
image/x-xpixmap xpm
image/x-xwindowdump xwd
message/rfc822  mht
message/rfc822  mhtml
message/rfc822  nws
text/css    css
text/h323   323
text/html   htm
text/html   html
text/html   stm
text/iuls   uls
text/plain  bas
text/plain  c
text/plain  h
text/plain  txt
text/richtext   rtx
text/scriptlet  sct
text/tab-separated-values   tsv
text/webviewhtml    htt
text/x-component    htc
text/x-setext   etx
text/x-vcard    vcf
video/mpeg  mp2
video/mpeg  mpa
video/mpeg  mpe
video/mpeg  mpeg
video/mpeg  mpg
video/mpeg  mpv2
video/quicktime mov
video/quicktime qt
video/x-la-asf  lsf
video/x-la-asf  lsx
video/x-ms-asf  asf
video/x-ms-asf  asr
video/x-ms-asf  asx
video/x-msvideo avi
video/x-sgi-movie   movie
x-world/x-vrml  flr
x-world/x-vrml  vrml
x-world/x-vrml  wrl
x-world/x-vrml  wrz
x-world/x-vrml  xaf
x-world/x-vrml  xof
81
iconoclast

L'attribut Accept a été introduit dans RFC 1867 , dans le but d'activer le filtrage du type de fichier en fonction du type MIME pour le contrôle de sélection de fichier. Mais à partir de 2008, la plupart des navigateurs, sinon tous, n'utilisent pas cet attribut. À l'aide de scripts côté client, vous pouvez effectuer une sorte de validation basée sur une extension pour soumettre des données de type correct (extension).

D'autres solutions pour le téléchargement de fichiers avancé nécessitent des animations Flash telles que SWFUpload ou Java Des applets tels que JUpload .

34
CMS

En 2015 le seul moyen que j'ai trouvé pour que cela fonctionne pour les deux Chrome et Firefox consiste à mettre toutes les extensions possibles que vous souhaitez prendre en charge, y compris les variantes:

accept=".jpeg, .jpg, .jpe, .jfif, .jif"

Problème avec FireFox : utilisation du type mime image/jpeg, FireFox ne montrera que les fichiers .jpg, très étrange comme si le commun .jpeg n'allait pas bien ...

Quoi que vous fassiez, assurez-vous d'essayer des fichiers ayant de nombreuses extensions différentes. Peut-être que cela dépend même du système d'exploitation ...

Je suppose que accept est insensible à la casse, mais peut-être pas dans tous les navigateurs.

Voici le documentation MDN sur accepter :

accept Si la valeur de l'attribut type est file, cet attribut indiquera les types de fichiers acceptés par le serveur, sinon il sera ignoré. La valeur doit être une liste de spécificateurs de type de contenu uniques, séparés par des virgules:

    A file extension starting with the STOP character (U+002E). (e.g. .jpg, .png, .doc).
    A valid MIME type with no extensions.
    audio/* representing sound files. HTML5
    video/* representing video files. HTML5
    image/* representing image files. HTML5
33
Christophe Roussy

Il est soutenu par Chrome. Il n'est pas censé être utilisé pour la validation, mais pour l'indication de type du système d'exploitation. Si vous avez un attribut accept="image/jpeg" dans un fichier téléchargé, le système d'exploitation ne peut afficher que les fichiers du type suggéré.

24
magikMaker

Cela fait quelques années et Chrome utilise au moins cet attribut. Cet attribut est très utile du point de vue de la convivialité, car il filtrera les fichiers inutiles pour l’utilisateur, ce qui simplifiera son expérience. Cependant, l'utilisateur peut toujours sélectionner "tous les fichiers" dans le type (ou contourner le filtre), vous devez donc toujours valider le fichier là où il est réellement utilisé; Si vous l'utilisez sur le serveur, validez-le avant de l'utiliser. L'utilisateur peut toujours contourner les scripts côté client.

11
Kevin Fee

Si le navigateur utilise cet attribut, il ne s'agit que d'une aide pour l'utilisateur. Il ne téléchargera donc pas un fichier de plusieurs mégaoctets juste pour le voir rejeté par le serveur ...
Idem pour la balise <input type="hidden" name="MAX_FILE_SIZE" value="100000">: si le navigateur l’utilise, il n’enverra pas le fichier mais une erreur entraînant une erreur UPLOAD_ERR_FORM_SIZE (2) dans PHP. (pas sûr de savoir comment il est géré dans d'autres langues).
Notez que ce sont des aides pour le tilisateur. Bien entendu, le serveur doit toujours vérifier le type et la taille du fichier à sa fin: il est facile de manipuler ces valeurs côté client.

6
PhiLho

En 2008, ce n'était pas important à cause du manque d'OS mobiles, mais c'est maintenant une chose assez importante.

Lorsque vous définissez les types de mime acceptés, par exemple dans Android, un dialogue système avec des applications lui est fourni qui peut lui fournir le contenu de mime accepté par la saisie de fichier. appareils est lent et souvent stressant.

Un point important est que certains navigateurs mobiles (basés sur Android version de Chrome 36 et Chrome Bêta 37) ne prennent pas en charge le filtrage d'applications sur les extensions et plusieurs types de mime.

0
Jakub Mendyk