Ograniczyć format pliku podczas korzystania?

Chciałbym ograniczyć Typ pliku, który można wybrać z natywnego wyboru pliku systemu operacyjnego, gdy użytkownik kliknie przycisk Przeglądaj w elemencie <input type="file"> W HTML. Mam wrażenie, że to niemożliwe, ale chciałbym wiedzieć, czy istnieje rozwiązanie. Chciałbym zachować wyłącznie do HTML i JavaScript; Nie Flash proszę.

Author: Sachin Joseph, 2010-12-01

11 answers

Ściśle mówiąc, odpowiedź brzmi Nie . Programista nie może uniemożliwić użytkownikowi przesyłanie plików dowolnego typu lub rozszerzenia.

ale mimo to, Akceptuj atrybut <input type = "file"> może pomóc w zapewnieniu filtra w oknie dialogowym Wybór pliku systemu operacyjnego. Na przykład,

<!-- (IE 10+, Edge (EdgeHTML), Edge (Chromium), Chrome, Firefox 42+) -->
<input type="file" accept=".xls,.xlsx" />

Powinien zapewnić sposób filtrowania plików innych niż .xls lub .xlsx. Chociaż strona MDN dla elementu input zawsze mówiła, że obsługuje to, ku mojemu zdziwieniu, to nie działa dla mnie w Firefoksie do wersji 42. Działa to w IE 10+, Edge i Chrome.

Firefoksa starszego niż 42 wraz z IE 10+, Edge, Chrome i Operą, lepiej jest użyć oddzielonej przecinkami listy typów MIME:

<!-- (IE 10+, Edge (EdgeHTML), Edge (Chromium), Chrome, Firefox) -->
<input type="file"
 accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel" /> 

[Edge (EdgeHTML) zachowanie: lista rozwijana filtr typów plików pokazuje typy plików wymienione tutaj, ale nie jest domyślna w rozwijanej liście. Domyślnym filtrem jest All files (*).]

Możesz także używać gwiazdek w typach MIME. Na przykład:

<input type="file" accept="image/*" /> <!-- all image types --> 
<input type="file" accept="audio/*" /> <!-- all audio types --> 
<input type="file" accept="video/*" /> <!-- all video types --> 

W3C poleca autorzy określają zarówno typy MIME, jak i odpowiadające im rozszerzenia w atrybucie accept. Zatem Najlepsze podejście to:

<!-- Right approach: Use both file extensions and corresponding MIME-types. -->
<!-- (IE 10+, Edge (EdgeHTML), Edge (Chromium), Chrome, Firefox) -->
<input type="file"
 accept=".xls,.xlsx, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel" /> 

JSFiddle tego samego: tutaj .

Bibliografia: lista typów MIME

Ważne: użycie accept atrybut zapewnia tylko sposób filtrowania w plikach typów, które są interesujące. Przeglądarki nadal pozwalają użytkownikom wybierać pliki dowolnego typu. Należy wykonać dodatkowe (po stronie klienta) kontrole (używając JavaScript, jednym ze sposobów byłoby to ), a na pewno typy plikówmusi zostać zweryfikowany na serwerze, użycie kombinacji typu MIME używającej zarówno rozszerzenia pliku, jak i jego sygnatury binarnej (ASP.NET, PHP, Ruby, Java ). Ty może warto również odnieść się do tych tabele dla typów plików i ich magicznych liczb , aby przeprowadzić bardziej solidną weryfikację po stronie serwera.

Oto trzy dobrze. czyta na plikach-przesyłanie i bezpieczeństwo.

EDIT: może weryfikacja typu pliku przy użyciu jego binarnej sygnatury może być również przeprowadzona po stronie Klienta przy użyciu JavaScript (a nie tylko patrząc na rozszerzenie) przy użyciu HTML5 File API, ale mimo to plik musi zostać zweryfikowany na serwerze, ponieważ złośliwy użytkownik nadal będzie mógł przesyłać pliki poprzez wykonanie niestandardowego żądania HTTP.

 1250
Author: Sachin Joseph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-12 20:45:07

Istnieje atrybut accept dla znacznika wejściowego. Nie jest jednak w żaden sposób wiarygodny. Przeglądarki najprawdopodobniej traktują to jako "sugestię", co oznacza, że użytkownik będzie również, w zależności od menedżera plików, miał wstępną selekcję, która wyświetla tylko pożądane typy. Nadal mogą wybrać "wszystkie pliki" i przesłać dowolny plik, który chcą.

Na przykład:

<form>
    <input type="file" name="pic" id="pic" accept="image/gif, image/jpeg" />
</form>

Czytaj więcej w HTML5 spec

Należy pamiętać, że może być stosowany tylko jako "pomoc" dla użytkownika, aby znaleźć odpowiednie pliki. Każdy użytkownik może wysłać dowolne żądanie na twój serwer. Zawsze trzeba sprawdzać wszystko po stronie serwera.

Więc odpowiedź brzmi: Nie ty nie możesz ograniczać , Ale możesz ustawić wstępną selekcję, ale nie możesz polegać na niej.

Alternatywnie lub dodatkowo możesz zrobić coś podobnego, sprawdzając nazwę pliku (wartość pola wejściowego) za pomocą JavaScript, ale jest to nonsens, ponieważ nie zapewnia ochrony, a także nie ułatwia wyboru dla użytkownika. Tylko potencjalnie zmusza webmastera do myślenia, że jest chroniony i otwiera dziurę bezpieczeństwa. Może to być ból w dupie dla użytkowników, którzy mają alternatywne rozszerzenia plików (na przykład jpeg zamiast jpg), wielkie litery lub żadnych rozszerzeń plików (jak to jest powszechne w systemach Linux).

 205
Author: The Surrican,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-11 23:53:42

Można użyć zdarzenia change do monitorowania tego, co użytkownik wybiera i powiadamiania go w tym momencie, że plik nie jest akceptowalny. Nie ogranicza rzeczywistej listy wyświetlanych plików, ale jest najbliżej klienta, poza słabo obsługiwanym atrybutem accept.

var file = document.getElementById('someId');

file.onchange = function(e) {
  var ext = this.value.match(/\.([^\.]+)$/)[1];
  switch (ext) {
    case 'jpg':
    case 'bmp':
    case 'png':
    case 'tif':
      alert('Allowed');
      break;
    default:
      alert('Not allowed');
      this.value = '';
  }
};
<input type="file" id="someId" />

JSFiddle

 101
Author: Gabriele Petrioli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-28 21:03:49

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ąć przesył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ś w stylu:

function beforeSubmit()
{
    var fname = document.getElementById("ifile").value;
    // check if fname has the desired extension
    if (fname hasDesiredExtension) {
        return true;
    } else {
        return false;
    }
}

Kod HTML:

<form method="post" onsubmit="return beforeSubmit();">
    <input type="file" id="ifile" name="ifile"/>
</form>
 48
Author: Pablo Santa Cruz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-01 20:47:29

Technicznie można określić accept atrybut (alternatywa w html5 ) na elemencie input, ale nie jest poprawnie obsługiwany.

 18
Author: zzzzBov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-03 00:10:42

Użyj znacznika input z atrybutemaccept

<input type="file" name="my-image" id="image" accept="image/gif, image/jpeg, image/png" />

Kliknij tutaj, aby zobaczyć najnowszą tabelę zgodności przeglądarki

Live demo tutaj

Aby wybrać tylko pliki obrazów, możesz użyć tego accept="image/*"

<input type="file" name="my-image" id="image" accept="image/*" />

Live demo tutaj

Wyświetlane będą tylko gif, jpg i png, screen grab z Chrome w wersji 44 Wyświetlane będą tylko gif, jpg i png, screen grab z Chrome w wersji 44

 10
Author: kiranvj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-31 05:35:09

Wiem, że to trochę za późno.

function Validatebodypanelbumper(theForm)
{
   var regexp;
   var extension =     theForm.FileUpload.value.substr(theForm.FileUpload1.value.lastIndexOf('.'));
   if ((extension.toLowerCase() != ".gif") &&
       (extension.toLowerCase() != ".jpg") &&
       (extension != ""))
   {
      alert("The \"FileUpload\" field contains an unapproved filename.");
      theForm.FileUpload1.focus();
      return false;
   }
   return true;
}
 9
Author: bpross,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-10 15:54:12

Możesz to zrobić z javascript, ale pamiętaj, że js jest po stronie klienta, więc będziesz "ostrzegał użytkowników", jakiego typu pliki mogą przesyłać, jeśli chcesz uniknąć (ograniczyć lub ograniczyć, jak powiedziałeś) określonego typu plików, musisz to zrobić po stronie serwera.

Spójrz na Ten podstawowy tut Jeśli chcesz rozpocząć walidację po stronie serwera. Aby zapoznać się z całym tutorialem, odwiedź tę stronę .

Powodzenia!

 5
Author: Trufa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-30 14:57:45

Jak wspomniano w poprzednich odpowiedziach, nie możemy ograniczać użytkownika do wybierania plików tylko dla podanych formatów plików. Ale bardzo przydatne jest użycie atrybutu accept tag on file w html.

Jeśli chodzi o walidację, musimy to zrobić po stronie serwera. Możemy to zrobić również po stronie klienta w js, ale nie jest to niezawodne rozwiązanie. Musimy zweryfikować po stronie serwera.

Do tych wymagań naprawdę wolę struts2 Java web application development framework. Dzięki wbudowanej funkcji przesyłania plików, przesyłanie plików do aplikacji internetowych opartych na struts2 to bułka z masłem. Wystarczy wspomnieć o formatach plików, które chcielibyśmy zaakceptować w naszej aplikacji, a całą resztę zajmuje rdzeń samego frameworka. Możesz to sprawdzić na oficjalnej stronie struts.

 5
Author: svg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-13 07:36:50

Mogę zaproponować następujące:

  • Jeśli Użytkownik ma domyślnie wybrać dowolny z plików graficznych, użyj accept= "image / *"

    <input type="file" accept="image/*" />

  • Jeśli chcesz ograniczyć 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 pliku filer do wszystkich plików, więc zawsze sprawdzaj Typ pliku w skrypcie i serwerze

 3
Author: Imran Javed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-02-14 10:03:14

Możesz użyć atrybutu "accept" jako filtra w polu wyboru pliku. Użycie "accept" pomaga filtrować pliki wejściowe na podstawie ich "sufiksu" lub ich "typu meme"

1.Filtr na podstawie przyrostka: Tutaj atrybut "accept" pozwala tylko wybrać pliki z .rozszerzenie jpeg.

<input type="file" accept=".jpeg" />

2.Filtrowanie na podstawie " typu pliku" Tutaj atrybut " accept "pozwala tylko wybrać plik z typem" image/jpeg".

<input type="file" accept="image/jpeg" />

Ważne: możemy zmienić lub usunąć rozszerzenie pliku, bez zmiany typu mema. Na przykład można mieć plik bez rozszerzenia, ale typem tego pliku może być "image / jpeg". Więc ten plik nie może przekazać accept=".JPEG " filtr. ale może przekazać accept= "image / jpeg".

3.Możemy użyć*, aby wybrać każdy rodzaj pliku. Na przykład poniższy kod pozwala wybrać wszystkie rodzaje obrazów. na przykład "image / png" lub "image / jpeg" lub ... . Wszystkie z nich są dozwolone.

<input type="file" accept="image/*" /> 

4.Możemy użyć cama ( , ) jako operatora " OR " w atrybucie select. Na przykład, aby umożliwić wszystkim rodzaj obrazów lub plików pdf możemy użyć tego kodu:

<input type="file" accept="image/* , application/pdf" />
 1
Author: Max Hesari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-13 14:37:50