ograniczanie plików do wyboru przez rozszerzenia [duplikat]

To pytanie ma już odpowiedź tutaj:

Jak ktoś może ograniczyć pliki, które można wybrać za pomocą elementu input type = "file" przez rozszerzenia ... ?

Znam już atrybut accept, ale w chrome ogranicza pliki o ostatni zdefiniowany typ MIME (w tym case "gif"), A FF4 niczego nie ogranicza.

<input type="file" accept="image/jpg, image/gif">
Czy robię coś złego? A może jest inny sposób?

Thy za każdą radę ...

Author: haemse, 2011-04-27

4 answers

Szczerze mówiąc, najlepszym sposobem na ograniczenie plików jest strona serwera. Ludzie mogą sfałszować Typ pliku na kliencie, więc pobranie pełnej nazwy pliku w czasie transferu serwera, parsowanie typu pliku, a następnie zwrócenie wiadomości jest zwykle najlepszym rozwiązaniem.

 15
Author: Sean Haddy,
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
2011-04-26 21:15:51

Łatwym sposobem na zrobienie tego byłoby:

<input type="file" accept=".gif,.jpg,.jpeg,.png,.doc,.docx">

Działa ze wszystkimi przeglądarkami, z wyjątkiem IE9. Nie testowałem go w IE10+.

 122
Author: Edi Budimilic,
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-02-04 22:59:03

Uwaga: Ta odpowiedź pochodzi z 2011 roku. to była wtedy naprawdę dobra odpowiedź, ale od 2015 roku natywne właściwości HTML są obsługiwane przez większość przeglądarek, więc nie ma (zazwyczaj) potrzeby implementowania takiej niestandardowej logiki w JS. Zobacz odpowiedź Edi i dokumenty .


Zanim plik zostanie przesłany, możesz sprawdzić rozszerzenie pliku za pomocą Javascript i zapobiec wysyłaniu formularza, jeśli nie pasuje. Nazwa pliku do przesłania jest zapisana w "wartości" pole elementu formularza.

Oto prosty przykład, który pozwala tylko na pliki, które kończą się".gif" do uploadu:

<script type="text/javascript">
    function checkFile() {
        var fileElement = document.getElementById("uploadFile");
        var fileExtension = "";
        if (fileElement.value.lastIndexOf(".") > 0) {
            fileExtension = fileElement.value.substring(fileElement.value.lastIndexOf(".") + 1, fileElement.value.length);
        }
        if (fileExtension.toLowerCase() == "gif") {
            return true;
        }
        else {
            alert("You must select a GIF file for upload");
            return false;
        }
    }
</script>

<form action="upload.aspx" enctype="multipart/form-data" onsubmit="return checkFile();">
    <input name="uploadFile" id="uploadFile" type="file" />

    <input type="submit" />
</form>
Jednak ta metoda nie jest niezawodna. Sean Haddy ma rację, że zawsze chcesz sprawdzić po stronie serwera, ponieważ użytkownicy mogą pokonać sprawdzanie Javascript, wyłączając javascript lub edytując kod po jego pojawieniu się w przeglądarce. Zdecydowanie Sprawdź po stronie serwera oprócz sprawdzenia po stronie klienta. Polecam również sprawdzenie rozmiaru po stronie serwera również, aby użytkownicy nie crash serwera z 2 GB pliku(nie ma sposobu, że wiem, Aby Sprawdzić Rozmiar Pliku po stronie klienta bez użycia Flash lub aplet Java lub coś).

Jednak sprawdzanie strony klienta przed ręką za pomocą metody, którą podałem tutaj, jest nadal przydatne, ponieważ może zapobiec błędom i jest niewielkim odstraszaczem do nie poważnych zgorszeń.

 22
Author: Joshua Carmody,
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-05-23 10:31:32
 function uploadFile() {
     var fileElement = document.getElementById("fileToUpload");
        var fileExtension = "";
        if (fileElement.value.lastIndexOf(".") > 0) {
            fileExtension = fileElement.value.substring(fileElement.value.lastIndexOf(".") + 1, fileElement.value.length);
        }
        if (fileExtension == "odx-d"||fileExtension == "odx"||fileExtension == "pdx"||fileExtension == "cmo"||fileExtension == "xml") {
         var fd = new FormData();
        fd.append("fileToUpload", document.getElementById('fileToUpload').files[0]);
        var xhr = new XMLHttpRequest();
        xhr.upload.addEventListener("progress", uploadProgress, false);
        xhr.addEventListener("load", uploadComplete, false);
        xhr.addEventListener("error", uploadFailed, false);
        xhr.addEve`enter code here`ntListener("abort", uploadCanceled, false);
        xhr.open("POST", "/post_uploadReq");
        xhr.send(fd);
        }
        else {
            alert("You must select a valid odx,pdx,xml or cmo file for upload");
            return false;
        }

      }

Próbowałem tego, działa bardzo dobrze

 1
Author: prajwal,
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-01-23 15:42:11