Введення файлу атрибут 'accept' - це корисно?


338

Реалізація завантаження файлів у форматі html є досить простою, але я щойно помітив, що є атрибут 'accept', який можна додати до <input type="file" ...>тегу.

Чи корисний цей атрибут як спосіб обмеження завантаження файлів на зображення тощо? Який найкращий спосіб використовувати його?

Як варіант, чи існує спосіб обмеження типів файлів, бажано у діалоговому вікні файлу, для тегу введення файлу html?


1
Щодо відповіді Лі Хуана, правильне посилання на w3school - це: w3schools.com/TAGS/att_input_accept.asp
PixEye

1
Я щойно спробував використовувати 'accept = application / x-gzip', і він працював з 'Chrome 19.0.1084.52', але нічого не робить у 'FF 13.0' та 'IE 8.0.6001'.
Jeach

Ознайомтеся з jsfiddle.net/jhfrench/cukjxnp6/embedded/result, щоб покращити input type="file"перевірку того, що acceptможна вибирати лише типи файлів ed.
Jeromy French

Відповіді:


439

acceptАтрибут неймовірно корисний. Для браузерів є підказкою показувати лише ті файли, які дозволені для поточного input. Хоча це може бути замінено користувачами, це допомагає звузити результати для користувачів за замовчуванням, тож вони можуть отримати саме те, що шукають, не потребуючи просіювати сотні різних типів файлів.

Використання

Примітка. Ці приклади написані на основі поточної специфікації і можуть фактично не працювати у всіх (або будь-яких) браузерах. Специфікація також може змінитися в майбутньому, що може порушити ці приклади.

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>

З специфікації HTML ( джерело )

acceptАтрибут може бути визначений , щоб надати агентам користувачів з натяком , які типи файлів будуть прийняті.

Якщо зазначено, атрибут повинен складатися з набору токенів , розділених комами , кожен з яких повинен відповідати регістру ASCII, невідчутним для одного з наступних:

Рядок audio/*

  • Позначає, що звукові файли прийняті.

Рядок video/*

  • Позначає, що відеофайли прийняті.

Рядок image/*

  • Вказує, що файли зображень прийняті.

Допустимий тип MIME без параметрів

  • Вказує, що файли вказаного типу прийняті.

Рядок, першим символом якого є повний STOP-символ U + 002E (.)

  • Вказує, що файли із вказаним розширенням файлу приймаються.

71
Мені потрібно було прийняти файли JPG, PNG, GIF, PDF та EPS, але accept='.jpg,.png,.gif,.pdf,.eps'не було дозволено жодного вибору. Я спробував багато варіацій - простір обмежений, без крапок символи тощо, але без кісток у Chrome v20, тому я в кінцевому підсумку використовував типи mime, і це спрацювало чудово:accept='image/jpeg,image/gif,image/png,application/pdf,image/x-eps'
Charlie Schliesser

7
Я можу змусити лише вищезазначене працювати в Chrome. У Firefox 13 я не можу змусити жодного численного типу файлів (відокремлених комами чи іншим способом) окрім того, щоб робити один тип підстановки, як-от image/*. Бампер.
Чарлі Шліссер

3
За специфікацією: Value: A set of comma-separated strings, each of which is a valid MIME type, with no parameters.Тільки типи мім. Немає розширень. Клієнт визначає тип mime.
Rudie

7
Я не впевнений, звідки ви отримуєте свою інформацію, але в специфікаціях, на які я A string whose first character is a U+002E FULL STOP character (.) -- Indicates that files with the specified file extension are accepted.
посилався

4
video/*означає, що ви не можете завантажити mp4 в Safari, вам також потрібно буде вказатиvideo/mp4
Kit Sunde

88

Так, це надзвичайно корисно в браузерах, які підтримують його, але "обмеження" - це як зручність для користувачів (тому вони не переповнені невідповідними файлами), а не як спосіб запобігти завантаженню речей, які ви не бажаєте. завантаження.

Він підтримується в

  • Chrome 16 +
  • Сафарі 6 +
  • Firefox 9 +
  • IE 10 +
  • Opera 11 +

Ось перелік типів вмісту, який ви можете використовувати з ним, а потім відповідні розширення файлів (хоча, звичайно, ви можете використовувати будь-яке розширення файлу):

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

Я не бачу нічого для шрифтів, таких як application / font-woff або application / x-font-ttf.
Трінько

@Triynko У мене така ж проблема, але я бачу, що, наприклад, Chrome, завантажує шрифт ttf як "application / octet-stream", тому це не може бути використане в елементі введення файлів ...
estani

Просто з’ясуйте, що accept може також використовувати суфікси файлів! так accept=".ttf"працює, як очікувалося.
estani

36

У 2015 році я знайшов єдиний спосіб роботи Chrome і Firefox - розмістити всі можливі розширення, які ви хочете підтримувати, включаючи варіанти:

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

Проблема з Firefox : Використання image/jpegтипу mime Firefox покаже лише .jpgфайли, дуже дивно, як ніби спільне .jpegне було нормально ...

Що б ви не робили, не забудьте спробувати файли з різними розширеннями. Можливо, це навіть залежить від ОС… Я, мабуть accept, нечутливий до регістру, але, можливо, не у кожному браузері.

Ось документи MDN про прийняття :

accept Якщо значенням атрибуту type є файл, то цей атрибут вказуватиме типи файлів, які приймає сервер, інакше він буде ігнорований. Значення повинно бути розділеним комами списком унікальних специфікаторів типу вмісту:

    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

1
Це найкраща відповідь, оскільки стосується сумісності між браузерами.
mbomb007

1
Ця відповідь хороша. Не забудьте включити символ "STOP", '.' Це було моє питання.
грибоксантракс

35

Атрибут Accept був введений в RFC 1867 , маючи намір включити фільтрацію типу файлів на основі типу MIME для управління вибором файлів. Але станом на 2008 рік, більшість, якщо не всі, браузери не використовують цей атрибут. Використовуючи сценарій на стороні клієнта, ви можете зробити своєрідну перевірку на основі розширення для подання даних правильного типу (розширення).

Інші рішення для розширеного завантаження файлів вимагають флеш-фільмів, таких як SWFUpload або Java аплетів, таких як JUpload .


5
За даними Wikipedia ( en.wikipedia.org/wiki/… ), здається, Opera є єдиним браузером, який підтримує її. Це справді велика ганьба.
Зекк

4
Хром, здається, використовує його. він, ймовірно, знайшов свій шлях у веб-кіт
yincrash

9
"Атрибут accept зараз підтримується лише Opera 11+, Chrome 16+ та Firefox 9+." Від: en.wikipedia.org/wiki/File_select#Accept_attribute_support
Саймон

6
IE 10+ підтримує атрибут accept. Це був останній негідник.
sj26

1
Правильна відповідь - новіша від @bfrohs - типи MIME: iana.org/assignments/media-types
juanmirocks

24

Він підтримується Chrome. Він не повинен використовуватися для перевірки, але для натяку на тип ОС. Якщо у вас є accept="image/jpeg"атрибут у файлі для завантаження, ОС може відображати лише файли запропонованого типу.


6
Я підтверджую, що accept="image/*"працює на Firefox, Chrome і Opera.
remi.gaubert

1
він не працює в Safari, я використовую Safari 5.1.7 в Windows
анад

@MMMMS Вам потрібно надати тип MIME, а не розширення файлу. Використовуйте accept="text/plain"замість цього.
mbomb007

12

Минуло кілька років, і Chrome принаймні використовує цей атрибут. Цей атрибут дуже корисний з точки зору зручності використання, оскільки він відфільтрує непотрібні файли для користувача, зробивши їхній досвід більш плавним. Однак користувач все ще може вибрати "всі файли" типу (або іншим чином обійти фільтр), таким чином, ви завжди повинні перевірити файл там, де він фактично використовується; Якщо ви використовуєте його на сервері, перед його використанням підтвердіть його. Користувач завжди може обійти будь-який сценарій на стороні клієнта.


6

Якщо браузер використовує цей атрибут, це лише як допомога для користувача, тому він не завантажує мультибайтовий файл лише для того, щоб побачити його відхиленим сервером ...
Те саме для <input type="hidden" name="MAX_FILE_SIZE" value="100000">тега: якщо браузер його використовує, він не надсилатиме файл, але помилка, що призводить до UPLOAD_ERR_FORM_SIZE(2) помилки в PHP (не впевнений, як він обробляється на інших мовах).
Зауважте, що це допомога для користувача . Звичайно, сервер повинен завжди перевіряти тип і розмір файлу на його кінці: легко підробити ці значення на стороні клієнта.


0

Ще в 2008 році це було не важливо через відсутність мобільних ОС, але зараз досить важлива річ.

Якщо ви встановлюєте прийняті типи mime, то, наприклад, користувачеві Android надається системний діалог із програмами, які можуть надати йому вміст mime, який вводить файл, що чудово, тому що навігація по файлах у файловому досліднику на мобільних пристроях повільна і часто напружує. .

Важливим є те, що деякі мобільні браузери (засновані на версії Android з Chrome 36 та Chrome Beta 37) не підтримують фільтрацію додатків за розширеннями та кількома типами mime.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.