HTML: Jak ograniczyć przesyłanie plików do samych obrazów?


126

Jak za pomocą HTML ograniczyć typy plików, które można przesyłać?

Aby ułatwić użytkownikom obsługę, chcę ograniczyć przesyłanie plików do samych obrazów (jpeg, gif, png).

<form method="post" action="..." enctype="multipart/form-data">
<label for="image">Photo</label>
<input name="image" type="file" />
</form>

Oczywiście, aby to odpowiednio zabezpieczyć - sprawdziłbym po stronie zaplecza / serwera. Ale wszystko, czego szukam, to sposób na proste wrażenia użytkownika, aby po kliknięciu przycisku „Przeglądaj” w celu znalezienia obrazu, który chcą przesłać, nie musieli wyświetlać wszystkich tych dokumentów słownych itp., Które nie mają zastosowania do upload
JacobT

Nie wiem, czy możesz ustawić maskę pliku. Nigdy nie widziałem, żeby to się udało.
Robert K

Odpowiedzi:


230

HTML5 mówi <input type="file" accept="image/*">. Oczywiście nigdy nie ufaj walidacji po stronie klienta: zawsze sprawdź ponownie po stronie serwera ...


87

Plik wejściowy HTML5 ma atrybut akceptacji, a także atrybut wielokrotny. Używając wielu atrybutów, możesz przesłać wiele obrazów w jednej instancji.

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

Możesz także ograniczyć wiele typów MIME.

<input type="file" multiple accept='image/*|audio/*|video/*' >

i inny sposób sprawdzania typu MIME przy użyciu obiektu pliku.

obiekt pliku podaje nazwę, rozmiar i typ.

var files=e.target.files;

var mimeType=files[0].type; // You can get the mime type

Możesz również ograniczyć możliwość przesyłania niektórych typów plików przez użytkownika za pomocą powyższego kodu.


4
image/*|audio/*|video/*nie działa dla mnie, wydaje się, że powinien być oddzielony przecinkami:image/*,video/mp4,.txt
serg

Świetne do sprawdzania typu mimeType! Tx!
Pedro Ferreira

6

Edytowano

Gdyby wszystko było tak, jak POWINNO, można to zrobić za pomocą atrybutu „Akceptuj”.

http://www.webmasterworld.com/forum21/6310.htm

Jednak przeglądarki prawie to ignorują, więc jest to nieodparte. Krótka odpowiedź brzmi: nie sądzę, aby można było to zrobić w HTML. Zamiast tego musiałbyś to sprawdzić po stronie serwera.

Poniższy starszy post zawiera informacje, które mogą pomóc w znalezieniu alternatyw.

Atrybut „accept” dla wejścia pliku - czy jest przydatny?


6

Oto kod HTML do przesłania obrazu. Domyślnie pokaże pliki graficzne tylko w oknie przeglądania, ponieważ umieściliśmy accept="image/*". Ale nadal możemy to zmienić z listy rozwijanej i pokaże wszystkie pliki. Więc część JavaScript sprawdza, czy wybrany plik jest rzeczywistym obrazem.

 <div class="col-sm-8 img-upload-section">
     <input name="image3" type="file" accept="image/*" id="menu_images"/>
     <img id="menu_image" class="preview_img" />
     <input type="submit" value="Submit" />
 </div> 

Tutaj w przypadku zmiany najpierw sprawdzamy rozmiar obrazu. W drugim ifwarunku sprawdzamy, czy jest to plik obrazu.

this.files[0].type.indexOf("image")będzie, -1jeśli nie jest to plik obrazu.

document.getElementById("menu_images").onchange = function () {
    var reader = new FileReader();
    if(this.files[0].size>528385){
        alert("Image Size should not be greater than 500Kb");
        $("#menu_image").attr("src","blank");
        $("#menu_image").hide();  
        $('#menu_images').wrap('<form>').closest('form').get(0).reset();
        $('#menu_images').unwrap();     
        return false;
    }
    if(this.files[0].type.indexOf("image")==-1){
        alert("Invalid Type");
        $("#menu_image").attr("src","blank");
        $("#menu_image").hide();  
        $('#menu_images').wrap('<form>').closest('form').get(0).reset();
        $('#menu_images').unwrap();         
        return false;
    }   
    reader.onload = function (e) {
        // get loaded data and render thumbnail.
        document.getElementById("menu_image").src = e.target.result;
        $("#menu_image").show(); 
    };

    // read the image file as a data URL.
    reader.readAsDataURL(this.files[0]);
};

Proszę dodać wyjaśnienie.
Paul Swetz

Zwróć uwagę, że powyższe wymaga jQuery, ale tego nie mówi. Wystarczająco łatwe do odgadnięcia, ale pomocne w stwierdzeniu. Stworzyłem do tego skrzypce . Robi inne rzeczy (wymagane w przypadku projektu), ale koncepcja jest bardzo podobna.
Dave Land

2
<script>

    function chng()
    {
        var typ=document.getElementById("fiile").value;
        var res = typ.match(".jp");

        if(res)
        {
            alert("sucess");
        }
        else
        {
            alert("Sorry only jpeg images are accepted");
            document.getElementById("fiile").value="; //clear the uploaded file
        }
    }

</script>

Teraz w części html

<input type="file" onchange="chng()">

ten kod sprawdzi, czy przesłany plik jest plikiem jpg, czy nie, i ogranicza możliwość przesyłania innych typów


To sprawdzenie jest omijane przez prostą zmianę nazwy rozszerzenia pliku. Powinieneś przynajmniej sprawdzić typ identyfikatora URI danych, jeśli masz zamiar zrobić coś takiego.
Lucas Leblanc

1

Możesz to zrobić tylko bezpiecznie po stronie serwera. Używanie atrybutu „accept” jest dobre, ale musi być również sprawdzone po stronie serwera, aby użytkownicy nie mogli cURLować do skryptu bez tego ograniczenia.

Proponuję: odrzucić wszystkie pliki niebędące obrazami, ostrzec użytkownika i ponownie wyświetlić formularz.


0

Ostatecznie filtr wyświetlany w oknie Przeglądaj jest ustawiany przez przeglądarkę. Możesz określić wszystkie żądane filtry w atrybucie Accept, ale nie masz gwarancji, że przeglądarka użytkownika będzie go przestrzegać.

Najlepszym rozwiązaniem jest przeprowadzenie pewnego rodzaju filtrowania na zapleczu serwera.


0

Pobierz projekt o nazwie Uploadify. http://www.uploadify.com/

Jest to program do przesyłania plików oparty na Flash + jQuery. Wykorzystuje to okno dialogowe wyboru plików Flash, które daje możliwość filtrowania typów plików, wybierania wielu plików w tym samym czasie itp.


30
Flash? ... nie ma mowy!
ErickBest

14
Najgorsze rozwiązanie w historii.
Matteo Mosconi

1
Chłopaki, nie rozumiem, dlaczego to najgorsze rozwiązanie w historii. Chociaż to prawda, Flash zniknie, nadal jest używany przez stare przeglądarki - bardzo stare, ok, ale nadal jest używane - i to rozwiązanie ma oba typy technologii: jQuery + HTML5 i Flash. Jest tak dobry jak VideoJS, który ma awaryjny Flash na wypadek, gdyby przeglądarka nie mogła odtworzyć wideo ... Nie testowałem rozwiązania, może nie być najlepsze, ale głosy przeciw nie są sprawiedliwe.
Unapedra

1
+1 Głupie, aby głosować za odrzuceniem Flash jest wyłączany, ale ma dobrą rezerwę. Jak myślisz, czego Google używa w Gmailu do zastępowania gniazda? Głupi.
Jason Sebring

8
Ta odpowiedź ma 4 lata. W tamtym czasie obsługa HTML5 dla wielokrotnego wyboru plików lub filtrowania okna wyboru pliku według akceptowanych typów nie była dobrze obsługiwana w żadnej z głównych przeglądarek. To było rozwiązanie, które sprawdziłoby się w tamtym czasie dla wielu, ale teraz przeszedłbym w kierunku czystego rozwiązania HTML5.
AndrewR
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.