Chciałbym ograniczyć typ pliku, który można wybrać z natywnego selektora plików systemu operacyjnego, gdy użytkownik kliknie przycisk Przeglądaj w <input type="file">
elemencie HTML. Mam wrażenie, że to niemożliwe, ale chciałbym wiedzieć, czy jest jakieś rozwiązanie. Chciałbym trzymać się wyłącznie HTML i JavaScript; proszę nie Flash.
667
Odpowiedzi:
Ściśle mówiąc, odpowiedź brzmi „ nie” . Deweloper nie może uniemożliwić użytkownikowi przesyłania plików dowolnego typu lub rozszerzenia.
Mimo to atrybut accept
<input type = "file">
może pomóc w zapewnieniu filtru w oknie dialogowym wyboru pliku w systemie operacyjnym. Na przykład,powinien zapewnić sposób na odfiltrowanie plików innych niż .xls lub .xlsx. Chociaż strona MDN dla
input
elementu zawsze mówiła, że to obsługuje, ku mojemu zaskoczeniu, nie działało to dla mnie w Firefoksie do wersji 42. To działa w IE 10+, Edge i Chrome.Tak więc, do obsługi Firefoksa starszego niż 42 wraz z IE 10+, Edge, Chrome i Opera, myślę, że lepiej jest używać listy typów MIME oddzielonych przecinkami:
Zachowanie [ Edge (EdgeHTML): lista rozwijana filtru typów plików pokazuje typy plików wymienione tutaj, ale nie jest domyślna w liście rozwijanej. Domyślny filtr to
All files (*)
.]Możesz także używać gwiazdek w typach MIME. Na przykład:
W3C zaleca autorom określenie w
accept
atrybucie zarówno typów MIME, jak i odpowiednich rozszerzeń . Zatem najlepszym podejściem jest:JSFiddle tego samego: tutaj .
Odniesienie: Lista typów MIME
WAŻNE: Użycie tego
accept
atrybutu zapewnia jedynie sposób filtrowania w interesujących plikach typów. Przeglądarki nadal pozwalają użytkownikom wybierać pliki dowolnego typu. Należy wykonać dodatkowe kontrole (po stronie klienta) (przy użyciu JavaScript, jednym ze sposobów byłoby to ), a zdecydowanie typy plików MUSZĄ zostać zweryfikowane na serwerze , przy użyciu kombinacji typu MIME przy użyciu zarówno rozszerzenia pliku, jak i jego podpisu binarnego ( ASP .NET , PHP , Ruby , Java ). Możesz także zapoznać się z tymi tabelami, aby uzyskać informacje o typach plików i ich magicznych liczbach, aby przeprowadzić bardziej niezawodną weryfikację po stronie serwera.Oto trzy dobre czyta na przesyłaniu plików i bezpieczeństwa.
EDYCJA: Może weryfikacja typu pliku za pomocą jego podpisu binarnego może być również przeprowadzona po stronie klienta za pomocą JavaScript (a nie tylko poprzez spojrzenie na rozszerzenie) za pomocą interfejsu API plików HTML5, ale plik musi zostać zweryfikowany na serwerze, ponieważ złośliwy użytkownik nadal będzie mógł przesyłać pliki, wysyłając niestandardowe żądanie HTTP.
źródło
accept
nadal nie działa w Krawędzi: stackoverflow.com/questions/31875617/... . Więcej informacji tutaj: wpdev.uservoice.com/forums/257854-microsoft-edge-developer/...exclude="exe"
. ¯_ (ツ) _ / ¯Istnieje atrybut accept dla znacznika wejściowego. Jednak nie jest w żaden sposób wiarygodny. Przeglądarki najprawdopodobniej traktują to jako „sugestię”, co oznacza, że użytkownik, w zależności od menedżera plików, będzie miał wstępny wybór, który wyświetla tylko żądane typy. Nadal mogą wybrać „wszystkie pliki” i przesłać dowolny plik.
Na przykład:
Przeczytaj więcej w specyfikacji HTML5
Należy pamiętać, że może on służyć jedynie jako „pomoc” dla użytkownika w znalezieniu odpowiednich plików. Każdy użytkownik może wysłać dowolne żądanie na serwer. Zawsze musisz zweryfikować wszystko po stronie serwera.
Więc odpowiedź brzmi: nie ty nie może ograniczać , ale można ustawić preselekcji, ale nie można na nim polegać.
Alternatywnie lub dodatkowo możesz zrobić coś podobnego, sprawdzając nazwę pliku (wartość pola wejściowego) za pomocą JavaScript, ale to nonsens, ponieważ nie zapewnia ochrony, a także nie ułatwia wyboru użytkownika. To tylko potencjalnie może skłonić webmastera do myślenia, że jest chroniony i otwiera lukę w zabezpieczeniach. Dla użytkowników, którzy mają alternatywne rozszerzenia plików (na przykład jpeg zamiast jpg), duże lub nie mają żadnych rozszerzeń plików (jak to często bywa w systemach Linux), może to być kłopotliwe.
źródło
Możesz użyć
change
zdarzenia do monitorowania tego, co użytkownik wybiera i powiadamiania go w tym momencie, że plik jest niedopuszczalny. Nie ogranicza faktycznej listy wyświetlanych plików, ale jest to najbliższa czynność po stronie klienta, oprócz słabo obsługiwanegoaccept
atrybutu.JSFiddle
źródło
Tak masz rację. To niemożliwe z HTML. Użytkownik będzie mógł wybrać dowolny plik, który chce.
Możesz napisać fragment kodu JavaScript, aby uniknąć przesłania pliku na podstawie jego rozszerzenia. Należy jednak pamiętać, że w żaden sposób nie uniemożliwi to złośliwemu użytkownikowi przesłania dowolnego pliku, który naprawdę chce.
Coś jak:
Kod HTML:
źródło
Technicznie możesz określić
accept
atrybut (alternatywny w html5 ) dlainput
elementu, ale nie jest on poprawnie obsługiwany.źródło
Użyj
input
tagu zaccept
atrybutemKliknij tutaj, aby wyświetlić najnowszą tabelę zgodności przeglądarki
Demo na żywo tutaj
Aby wybrać tylko pliki obrazów, możesz użyć tego
accept="image/*"
Demo na żywo tutaj
Wyświetlane będą tylko gif, jpg i png, zrzut ekranu z przeglądarki Chrome w wersji 44
źródło
accept="image/*"
, w selektorze plików jest napisane „Pliki obrazów” zamiast „Pliki niestandardowe”, co jest miłe dla użytkownika końcowego.Wiem, że to trochę za późno.
źródło
Możesz to zrobić za pomocą javascript, ale pamiętaj, że js jest po stronie klienta, więc w rzeczywistości „ostrzegasz użytkowników”, jakie typy plików mogą przesłać, jeśli chcesz UNIKNĄĆ (ograniczyć lub ograniczyć, jak powiedziałeś) określonego rodzaju plików, które MUSISZ zrób to po stronie serwera.
Spójrz na ten podstawowy poradnik, jeśli chcesz zacząć od sprawdzania poprawności po stronie serwera. Aby zobaczyć cały samouczek, odwiedź tę stronę .
Powodzenia!
źródło
Jak wspomniano w poprzednich odpowiedziach, nie możemy ograniczać użytkownika do wybierania plików tylko dla podanych formatów plików. Ale naprawdę przydatne jest użycie atrybutu accept w pliku html.
Jeśli chodzi o sprawdzanie poprawności, musimy to zrobić po stronie serwera. Możemy to również zrobić po stronie klienta w js, ale nie jest to niezawodne rozwiązanie. Musimy zweryfikować po stronie serwera.
W przypadku tych wymagań naprawdę wolę środowisko programowania aplikacji WWW struts2 Java. Dzięki wbudowanej funkcji przesyłania plików przesyłanie plików do aplikacji internetowych opartych na struts2 jest dziecinnie proste. Wystarczy wspomnieć o formatach plików, które chcielibyśmy zaakceptować w naszej aplikacji, a całą resztę zajmuje sam rdzeń frameworka. Możesz to sprawdzić na oficjalnej stronie firmy Struts.
źródło
Mogę zasugerować następujące:
Jeśli musisz domyślnie wybrać dowolny plik obrazu, użyj accept = "image / *"
<input type="file" accept="image/*" />
jeśli chcesz ograniczyć się do określonych typów obrazów, użyj accept = "image / bmp, image / jpeg, image / png"
<input type="file" accept="image/bmp, image/jpeg, image/png" />
jeśli chcesz ograniczyć się do określonych typów, użyj accept = ". bmp, .doc, .pdf"
<input type="file" accept=".bmp, .doc, .pdf" />
Nie można ograniczyć użytkownika do zmiany filtru plików na wszystkie pliki, dlatego zawsze należy sprawdzać poprawność typu pliku w skrypcie i serwerze
źródło