HTML: Как ограничить загрузку файлов только изображениями?

Как с помощью HTML ограничить типы файлов, которые можно загружать?

Чтобы упростить взаимодействие с пользователем, я хочу ограничить загрузку файлов только изображениями (jpeg, gif, png).

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

person JacobT    schedule 13.10.2009    source источник
comment
Очевидно, чтобы правильно это обезопасить - я бы проверил на стороне бэкэнда / сервера. Но все, что я ищу, это способ упростить взаимодействие с пользователем, чтобы, когда они нажимают кнопку «Обзор», чтобы найти изображение, которое они хотят загрузить, им не нужно видеть все эти текстовые документы и т. Д., Которые не применимы для загрузки.   -  person JacobT    schedule 13.10.2009
comment
Не знаю, можно ли установить маску файла. Я никогда не видел, чтобы это было удачно.   -  person Robert K    schedule 13.10.2009


Ответы (10)


HTML5 говорит <input type="file" accept="image/*">. Конечно, никогда не доверяйте проверке на стороне клиента: всегда проверяйте еще раз на стороне сервера ...

person Ms2ger    schedule 13.10.2009

Ввод файла HTML5 имеет атрибут accept, а также множественный атрибут. Используя несколько атрибутов, вы можете загружать несколько изображений в один экземпляр.

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

Вы также можете ограничить использование нескольких типов пантомимы.

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

и другой способ проверки типа MIME с помощью файлового объекта.

файловый объект дает вам имя, размер и тип.

var files=e.target.files;

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

Вы также можете ограничить пользователя для загрузки некоторых типов файлов с помощью приведенного выше кода.

person kongaraju    schedule 16.06.2012
comment
image/*|audio/*|video/* у меня не работает, кажется, надо разделять запятыми: image/*,video/mp4,.txt - person serg; 06.01.2016
comment
Отлично подходит для проверки mimeType! Тх! - person Pedro Ferreira; 08.11.2017

Отредактировано

Если бы все было так, как ДОЛЖНО, вы могли бы сделать это с помощью атрибута «Принять».

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

Однако браузеры в значительной степени игнорируют это, так что это несущественно. Короткий ответ: я не думаю, что есть способ сделать это в HTML. Вместо этого вам нужно будет проверить это на стороне сервера.

В следующем более старом посте есть некоторая информация, которая может помочь вам с альтернативами.

Атрибут 'accept' ввода файла - это полезно?

person David    schedule 13.10.2009

Вот HTML для загрузки изображения. По умолчанию файлы изображений будут отображаться только в окне просмотра, потому что мы поместили accept="image/*". Но мы все равно можем изменить его в раскрывающемся списке, и он покажет все файлы. Таким образом, часть Javascript проверяет, является ли выбранный файл фактическим изображением.

 <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> 

Здесь, в событии изменения, мы сначала проверяем размер изображения. И во втором if условии мы проверяем, является ли это файлом изображения.

this.files[0].type.indexOf("image") будет -1, если это не файл изображения.

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]);
};
person Vineesh Puttanisseri    schedule 28.06.2016
comment
Добавьте объяснение, пожалуйста. - person Paul Swetz; 28.06.2016
comment
Обратите внимание, что приведенное выше требует jquery, но не говорит об этом. Достаточно легко понять, но полезно сформулировать. Я создал для этого скрипку. Он выполняет некоторые другие функции (необходимые для проекта), но концепция во многом такая же. - person Dave Land; 17.06.2017

Вот что я успешно использую:

...
<div class="custom-file">
    <input type="file" class="custom-file-input image-gallery" id="image-gallery" name="image-gallery[]" multiple accept="image/*">
   <label class="custom-file-label" for="image-gallery">Upload Image(s)</label>
</div>
...

Всегда рекомендуется проверять фактический тип файла и на стороне сервера.

person hackernewbie    schedule 15.08.2020

<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>

Теперь в html-части

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

этот код проверяет, является ли загруженный файл файлом jpg или нет, и ограничивает загрузку других типов

person Arun Prabhakaran P    schedule 11.10.2016
comment
Эта проверка отменяется простым переименованием расширения файла. Вы должны хотя бы проверить тип URI данных, если собираетесь сделать что-то подобное. - person Lucas Leblanc; 23.10.2018

Вы можете сделать это безопасно только на стороне сервера. Использование атрибута accept - это хорошо, но он также должен быть проверен на стороне сервера, чтобы пользователи не могли использовать cURL для вашего скрипта без этого ограничения.

Я предлагаю вам: удалить все файлы, не являющиеся изображениями, предупредить пользователя и повторно отобразить форму.

person Robert K    schedule 13.10.2009

Поскольку <input type="file" id="fileId" accept="image/*"> не может гарантировать, что кто-то выберет изображение, вам понадобится такая проверка:

if(!(document.getElementById("fileId").files[0].type.match(/image.*/))){
                alert('You can\'t upload this type of file.');
                return;
}
person Aleksandra    schedule 16.11.2020

В конечном итоге фильтр, отображаемый в окне «Обзор», устанавливается браузером. Вы можете указать все нужные фильтры в атрибуте Accept, но у вас нет гарантии, что браузер вашего пользователя будет его придерживаться.

Лучше всего выполнить какую-то фильтрацию в бэкэнде на сервере.

person John Lechowicz    schedule 13.10.2009

Оформить заказ на проект под названием Uploadify. http://www.uploadify.com/

Это загрузчик файлов на основе Flash + jQuery. При этом используется диалоговое окно выбора файла Flash, которое дает вам возможность фильтровать типы файлов, выбирать несколько файлов одновременно и т. Д.

person AndrewR    schedule 14.04.2011
comment
Ребята, я не понимаю, почему это худшее решение на свете. Хотя это правда, что Flash исчезнет, ​​он все еще используется старыми браузерами - очень старыми, хорошо, но все еще используется - и это решение имеет оба типа технологий: jQuery + HTML5 и резервное копирование Flash. Это так же хорошо, как VideoJS, у которого есть резервный Flash на случай, если браузер не может воспроизвести видео ... Я не тестировал решение, оно может быть не лучшим, но отрицательные голоса несправедливы. - person Unapedra; 26.06.2014
comment
+1 Глупо голосовать против. Flash уходит, но имеет хороший запасной вариант. Как вы думаете, что Google использует для Gmail для отката сокетов? Глупый. - person King Friday; 20.10.2014
comment
Этому ответу 4 года. В то время поддержка HTML5 для множественного выбора файлов или фильтрации окна выбора файлов по принятым типам не поддерживалась ни одним из основных браузеров. Это было решение, которое в то время сработало бы для многих, но сейчас я бы перешел к решению на чистом HTML5. - person AndrewR; 16.04.2015
comment
@AndrewR, пожалуйста, обновите ответ, так как он сейчас обновлен. - person Ulrich Dohou; 12.10.2019