Atrybut „wprowadź” pliku - czy jest przydatny?

338

Implementacja przesyłania pliku w formacie HTML jest dość prosta, ale zauważyłem, że istnieje atrybut „Akceptuj”, który można dodać do <input type="file" ...>tagu.

Czy ten atrybut jest przydatny jako sposób ograniczenia przesyłania plików do obrazów itp.? Jak najlepiej go używać?

Alternatywnie, czy istnieje sposób ograniczenia typów plików, najlepiej w oknie dialogowym pliku, dla znacznika wejściowego pliku HTML?

Darren Oster
źródło
1
Jeśli chodzi o odpowiedź Li Huan, właściwy link do w3school to: w3schools.com/TAGS/att_input_accept.asp
PixEye
1
Właśnie próbowałem użyć „accept = application / x-gzip” i działało to z „Chrome 19.0.1084.52”, ale nic nie robi w „FF 13.0” i „IE 8.0.6001”.
Jeach
Sprawdź jsfiddle.net/jhfrench/cukjxnp6/embedded/result, aby dowiedzieć się, jak ulepszyć input type="file"sprawdzanie, acceptczy można wybierać tylko typy plików ed.
Jeromy French

Odpowiedzi:

439

Ten acceptatrybut jest niezwykle przydatny. Jest to wskazówka dla przeglądarek, aby wyświetlać tylko pliki dozwolone dla bieżącego input. Chociaż zwykle może być zastąpiony przez użytkowników, pomaga domyślnie zawęzić wyniki dla użytkowników, dzięki czemu mogą uzyskać dokładnie to, czego szukają, bez konieczności przeszukiwania setek różnych typów plików.

Stosowanie

Uwaga: te przykłady zostały napisane w oparciu o bieżącą specyfikację i mogą nie działać w rzeczywistości we wszystkich przeglądarkach. Specyfikacja może również ulec zmianie w przyszłości, co może złamać te przykłady.

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>

Ze specyfikacji HTML ( źródło )

acceptAtrybut może być określona przez użytkownika, aby zapewnić środki z nutą jakie typy plików będą akceptowane.

Jeśli jest określony, atrybut musi składać się z zestawu tokenów oddzielonych przecinkami , z których każdy musi być zgodny z rozróżnianiem wielkości liter w kodzie ASCII dla jednego z następujących elementów:

Ciąg audio/*

  • Wskazuje, że pliki dźwiękowe są akceptowane.

Ciąg video/*

  • Wskazuje, że pliki wideo są akceptowane.

Ciąg image/*

  • Wskazuje, że pliki obrazów są akceptowane.

Poprawny typ MIME bez parametrów

  • Wskazuje, że pliki określonego typu są akceptowane.

Ciąg, którego pierwszym znakiem jest U + 002E FULL STOP (.)

  • Wskazuje, że pliki o określonym rozszerzeniu są akceptowane.
0b10011
źródło
71
Musiałem zaakceptować pliki JPG, PNG, GIF, PDF i EPS, ale accept='.jpg,.png,.gif,.pdf,.eps'nie pozwoliłem na wybór. Próbowałem wielu odmian - rozdzielonych spacjami, bez kropek, itp., Ale bez kości w Chrome v20, więc skończyło się na użyciu typów MIME i zadziałało świetnie:accept='image/jpeg,image/gif,image/png,application/pdf,image/x-eps'
Charlie Schliesser
7
Mogę tylko sprawić, aby powyższe działało w Chrome. W Firefoksie 13 nie mogę uruchomić wielu typów plików (oddzielonych przecinkami lub w inny sposób) poza zrobieniem jednego typu symboli wieloznacznych image/*. Porażka.
Charlie Schliesser
3
Zgodnie ze specyfikacją: Value: A set of comma-separated strings, each of which is a valid MIME type, with no parameters.tylko typy mimów. Brak rozszerzeń. Od klienta zależy określenie typu MIME.
Rudie,
7
Nie jestem pewien, skąd otrzymujesz swoje informacje, ale w specyfikacji, do której A string whose first character is a U+002E FULL STOP character (.) -- Indicates that files with the specified file extension are accepted.
odsyłam
4
video/*oznacza, że ​​nie możesz przesłać mp4 w Safari, musisz także określićvideo/mp4
Kit Sunde,
88

Tak, jest to niezwykle przydatne w przeglądarkach, które go obsługują, ale „ograniczenie” jest dla wygody użytkowników (aby nie były przytłoczone nieistotnymi plikami), a nie jako sposób na uniemożliwienie im przesyłania rzeczy, których nie chcesz. przesyłanie.

Jest obsługiwany w

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

Oto lista typów zawartości, których można z nim używać, wraz z odpowiadającymi im rozszerzeniami plików (choć oczywiście można użyć dowolnego rozszerzenia pliku):

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
ikonoklasta
źródło
Nic nie widzę dla czcionek, takich jak application / font-woff lub application / x-font-ttf.
Triynko
@Triynko Mam ten sam problem, ale widzę, że np. Chrome przesyła czcionkę ttf jako „application / octet-stream”, więc nie można jej użyć w elemencie wejściowym pliku ...
estani
Po prostu dowiedz się, że accept może również używać sufiksów plików! więc accept=".ttf"działa zgodnie z oczekiwaniami.
estani
36

W 2015 roku jedynym sposobem , który sprawił, że działam zarówno w Chrome, jak i Firefox, jest umieszczenie wszystkich możliwych rozszerzeń, które chcesz obsługiwać, w tym wariantów:

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

Problem z Firefoksem : Używanie image/jpegmima Firefox wyświetla tylko .jpgpliki, bardzo dziwne, jakby to, co wspólne, .jpegnie było w porządku ...

Cokolwiek zrobisz, koniecznie wypróbuj pliki z wieloma różnymi rozszerzeniami. Może to zależy nawet od systemu operacyjnego ... Wydaje mi się, że wielkość acceptliter nie ma znaczenia, ale może nie w każdej przeglądarce.

Oto dokumenty MDN dotyczące akceptacji :

accept Jeśli wartością atrybutu type jest file, wówczas ten atrybut wskazuje typy plików, które serwer akceptuje, w przeciwnym razie zostanie zignorowany. Wartość musi być oddzieloną przecinkami listą unikatowych specyfikatorów typu treści:

    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
Christophe Roussy
źródło
1
To najlepsza odpowiedź, ponieważ dotyczy kompatybilności z różnymi przeglądarkami.
mbomb007
1
Ta odpowiedź jest dobra. Pamiętaj o dołączeniu znaku „STOP”, „.”. To był mój problem.
fungusanthrax,
35

Atrybut Accept został wprowadzony w RFC 1867 , w celu włączenia filtrowania typu pliku na podstawie typu MIME dla formantu wyboru pliku. Jednak od 2008 r. Większość przeglądarek, jeśli nie wszystkie, nie korzysta z tego atrybutu. Korzystając ze skryptów po stronie klienta, możesz dokonać pewnego rodzaju weryfikacji na podstawie rozszerzenia, aby przesłać dane poprawnego typu (rozszerzenie).

Inne rozwiązania do zaawansowanego przesyłania plików wymagają filmów Flash, takich jak SWFUpload lub apletów Java, takich jak JUpload .

CMS
źródło
5
Według Wikipedii ( en.wikipedia.org/wiki/... ) Opera wydaje się być jedyną przeglądarką, która ją obsługuje. To naprawdę wielka szkoda.
Zecc
4
Chrome wydaje się go używać. prawdopodobnie trafił do webkita
yincrash
9
„Atrybut accept jest obecnie obsługiwany tylko w Opera 11+, Chrome 16+ i Firefox 9+”. Od: en.wikipedia.org/wiki/File_select#Accept_attribute_support
Simon
6
IE 10+ obsługuje atrybut accept. To był ostatni maruder, który tego nie zrobił.
sj26
1
Prawidłowa odpowiedź to nowsza autorstwa @bfrohs - typy MIME: iana.org/assignments/media-types
juanmirocks
24

Jest obsługiwany przez Chrome. Nie należy go używać do sprawdzania poprawności, ale do podpowiedzi systemu operacyjnego. Jeśli masz accept="image/jpeg"atrybut w przesyłanym pliku, system operacyjny może wyświetlać tylko pliki sugerowanego typu.

magikMaker
źródło
6
Potwierdzam, że accept="image/*"działa na Firefox, Chrome i Opera.
remi.gaubert
1
nie działa w Safari, używam Safari 5.1.7 w systemie Windows
i
@MMMMS Musisz podać typ MIME, a nie rozszerzenie pliku. Użyj accept="text/plain"zamiast tego.
mbomb007,
12

Minęło kilka lat, a Chrome przynajmniej korzysta z tego atrybutu. Ten atrybut jest bardzo przydatny z punktu widzenia użyteczności, ponieważ odfiltrowuje niepotrzebne pliki dla użytkownika, dzięki czemu jego wrażenia są płynniejsze. Jednak użytkownik nadal może wybrać „wszystkie pliki” z danego typu (lub w inny sposób ominąć filtr), dlatego zawsze należy sprawdzić poprawność pliku, w którym jest on rzeczywiście używany; Jeśli używasz go na serwerze, sprawdź go przed użyciem. Użytkownik zawsze może ominąć wszelkie skrypty po stronie klienta.

Opłata Kevin
źródło
6

Jeśli przeglądarka korzysta z tego atrybutu, służy to jedynie jako pomoc dla użytkownika, więc nie prześle on pliku o wielkości wielu megabajtów, tylko po to, aby zobaczył, że został odrzucony przez serwer ... To
samo dla <input type="hidden" name="MAX_FILE_SIZE" value="100000">tagu: jeśli przeglądarka go używa, nie wyśle ​​pliku, ale wystąpi błąd powodujący błąd UPLOAD_ERR_FORM_SIZE(2) w PHP (nie jestem pewien, jak jest obsługiwany w innych językach).
Uwaga: są to pomocne dla użytkownika . Oczywiście serwer musi zawsze sprawdzać typ i rozmiar pliku na swoim końcu: łatwo jest manipulować tymi wartościami po stronie klienta.

PhiLho
źródło
0

W 2008 roku nie było to ważne z powodu braku mobilnych systemów operacyjnych, ale teraz jest to dość ważna rzecz.

Po ustawieniu akceptowanych typów MIME, na przykład użytkownik Androida otrzymuje okno systemowe z aplikacjami, które mogą dostarczyć mu zawartość MIME, którą akceptuje wejście pliku, co jest świetne, ponieważ nawigacja po plikach w eksploratorze plików na urządzeniach mobilnych jest powolna i często stresująca .

Jedną ważną rzeczą jest to, że niektóre przeglądarki mobilne (oparte na wersji Chrome 36 na Androida i Chrome Beta 37) nie obsługują filtrowania aplikacji po rozszerzeniach i wielu typach MIME.

KubaBest
źródło