Атрибут ввода файла «принять» - это полезно?

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.
Джером Френч

Ответы:

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 без параметров

  • Указывает, что файлы указанного типа принимаются.

Строка, первым символом которой является символ U + 002E FULL STOP (.)

  • Указывает, что файлы с указанным расширением принимаются.
0b10011
источник
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'
Чарли Шлиссер,
7
Я могу только заставить вышеописанное работать в Chrome. В Firefox 13 я не могу заставить работать несколько типов файлов (разделенных запятыми или иным образом), кроме как с использованием одного типа подстановочного знака image/*. Облом.
Чарли Шлиссер
3
Согласно спецификации: Value: A set of comma-separated strings, each of which is a valid MIME type, with no parameters.просто мимы. Нет расширений. Это зависит от клиента, чтобы определить тип пантомимы.
Руди
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+
  • Safari 6+
  • Firefox 9+
  • IE 10 +
  • Опера 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"работает как положено.
Эстани
36

В 2015 году я нашел единственный способ заставить его работать как для Chrome, так и для Firefox, - добавить все возможные расширения, которые вы хотите поддерживать, включая варианты:

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

Проблема с Firefox : при использовании image/jpegmime-типа Firefox будет показывать только .jpgфайлы, очень странно, как если бы с общим .jpegне все в порядке ...

Что бы вы ни делали, обязательно попробуйте файлы с разными расширениями. Может быть, это даже зависит от ОС ... Я полагаю accept, регистр не учитывается, но, возможно, не во всех браузерах.

Вот документы MDN о принятии :

принять Если значением атрибута type является file, то этот атрибут будет указывать типы файлов, которые принимает сервер, в противном случае он будет игнорироваться. Значение должно быть разделенным запятыми списком уникальных спецификаторов типа контента:

    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
Этот ответ хорош. Не забудьте включить символ «СТОП», «.». Это была моя проблема.
fungusanthrax
35

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

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

CMS
источник
5
Согласно Википедии ( en.wikipedia.org/wiki/… ), Opera, кажется, единственный браузер, поддерживающий ее. Это большой позор, правда.
Zecc
4
хром, кажется, использует его. он, вероятно, нашел свой путь в webkit
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 types: iana.org/assignments/media-types
juanmirocks
24

Поддерживается Chrome. Он не должен использоваться для проверки, но для указания типа ОС. Если у вас есть accept="image/jpeg"атрибут при загрузке файла, ОС может показывать только файлы предложенного типа.

magikMaker
источник
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 (не знаю, как она обрабатывается на других языках).
Обратите внимание, что это помогает пользователю . Конечно, сервер должен всегда проверять тип и размер файла на его конце: эти значения легко подделать на стороне клиента.

PhiLho
источник
0

Еще в 2008 году это было неважно из-за отсутствия мобильных ОС, но сейчас это очень важно.

Когда вы устанавливаете принятые типы пантомимы, то, например, пользователю Android предоставляется системный диалог с приложениями, которые могут предоставить ему контент пантомимы, который принимает ввод файлов, что хорошо, потому что навигация по файлам в проводнике на мобильных устройствах медленная и часто вызывает стресс. ,

Одна важная вещь заключается в том, что некоторые мобильные браузеры (основанные на версиях Chrome 36 и Chrome Beta 37 для Android) не поддерживают фильтрацию приложений по расширениям и нескольким типам пантомимы.

оборота КубаБест
источник