Ограничение типа файлов в HTML input: решение на JS

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы наложить ограничения на типы файлов, которые может выбрать пользователь, добавьте атрибут accept в элемент <input>:

HTML
Скопировать код
<input type="file" accept=".png, .jpeg">

Это позволит выбирать только файлы с расширениями .png и .jpeg, исключая все остальные.

Добавление MIME-типов для повышения совместимости

Указание MIME-типов в атрибуте accept усиливает кроссбраузерную функциональность:

HTML
Скопировать код
<input type="file" accept="image/png, image/jpeg">

Для максимальной совместимости рекомендуется указывать как MIME-типы, так и расширения файлов:

HTML
Скопировать код
<input type="file" accept=".png, .jpeg, image/png, image/jpeg">

Визуализация

Представьте <input type="file"> как фильтр, контролирующий типы подаваемых файлов. Атрибут accept задаёт правила этого контроля:

Markdown
Скопировать код
Cторож: "Какой у вас тип файла?" 
.txt: "У меня .txt, можно мне пройти?" 
Cторож: "Конечно ✅ Добро пожаловать!"

.jpg: "Я .jpg, позволите мне пройти?" 
Cторож: "Безусловно ✅ Входите!"

.xls: "А .xls может войти?" 
Cторож: "Сегодня не получится ❌ Попробуйте другую дверь."

Вот как настроен этот контроль:

HTML
Скопировать код
<input type="file" accept=".txt, .jpg">

Теперь .txt и .jpg проходят, а .xls остаётся за дверью.

Усиление клиентской валидации

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

Обработка выбора файла с помощью события onchange

Добавьте обработчик события onchange к элементу ввода файла для проверки расширений файлов "на лету". Мы признаём только определённые типы файлов.

JS
Скопировать код
document.getElementById('fileInput').onchange = function(e) {
    // Мы тщательно подходим к выбору форматов. В список допустимы только .png и .jpeg
    if(!e.target.files[0].name.match(/\.(png|jpeg)$/)) {
        alert('Принимаются только файлы форматов .png и .jpeg!');
        e.target.value = ''; // Мы не допускаем тех, кто не соответствует критериям
    }
};

Валидация файлов при отправке формы через onsubmit

Проведите последнюю проверку выбранных файлов при попытке отправить форму, используя обработчик события onsubmit:

JS
Скопировать код
document.getElementById('myForm').onsubmit = function(e) {
    // Проверка перед стартом! Есть ли .png или .jpeg?
    var files = document.getElementById('fileInput').files;
    if (!files.length || !files[0].name.match(/\.(png|jpeg)$/)) {
        alert('Пожалуйста, приложите файл в формате .png или .jpeg!');
        e.preventDefault(); // Правила нарушены, вход закрыт.
    }
};

Не забывайте, что валидация на клиентской стороне является удобным дополнением, но для обеспечения безопасности необходимы также проверки на сервере.

Устраняющие несоответствия браузеров

Работа с особенностями атрибута accept

Атрибут accept эффективен, но поддержка и интерпретация его могут отличаться между различными браузерами:

  • Иногда accept только фильтрует диалог выбора файлов, позволяя пользователю видеть все типы файлов.
  • Некоторые браузеры могут не корректно обрабатывать MIME-типы и обращать внимание только на расширения файлов.

Обеспечение согласованной работы в разных браузерах

Используйте сочетание MIME-типов и расширений файлов для достижения стабильности в разных браузерах. Протестируйте ваше решение в различных браузерах, чтобы гарантировать непрерывность пользовательского опыта.

Усиление безопасности через серверную валидацию

Серверная валидация — это не просто вариант, а обязательное требование. Непременно проведите проверку MIME-типа и бинарной подписи файла, чтобы предотвратить злонамеренную загрузку.

Знакомство с HTML5 File API

Познакомьтесь с HTML5 File API: с его помощью вы можете проверять фактическое содержимое файла на стороне клиента. Добро пожаловать на новый этап валидации.

Будьте в курсе: лучшие практики безопасности при загрузке файлов

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