Кратко
СкопированоАтрибут accept добавляется тегу <input>. Он позволяет указать, файлы какого типа пользователю нужно прикрепить.
Пример
СкопированоРассмотрим пример формы, где пользователю предлагается прикрепить фотографию кота:
<form method="post"> <label for="cat-picture">Прикрепите фото кота</label> <input type="file" id="cat-picture" name="cat-picture" accept=".jpg, .jpeg, .png" > <button>Прикрепить</button></form>
<form method="post">
<label for="cat-picture">Прикрепите фото кота</label>
<input
type="file"
id="cat-picture"
name="cat-picture"
accept=".jpg, .jpeg, .png"
>
<button>Прикрепить</button>
</form>
Эта форма будет отображать только файлы с указанными расширениями в диалоговом окне выбора файлов.
Как понять
СкопированоЭлемент <input> с атрибутом accept ограничивает типы файлов, которые можно выбрать в диалоговом окне выбора файлов. Это улучшает пользовательский опыт, делая процесс выбора файлов более удобным и менее подверженным ошибкам.
Важно понимать, что атрибут accept лишь показывает пользователю в открывшемся диалоговом окне файлы тех типов, которые вы указываете в значении атрибута, но не фильтрует их. Проверка типов файлов должна происходить на стороне сервера. Без этого ничто не помешает пользователю прикрепить скучный текстовый документ, хотя вы ждали фото котика.
Как пишется
СкопированоАтрибут accept применяется только к элементу <input> с типом file. Он может принимать следующие значения:
'audio— принимает звуковые файлы любого формата;/ *' 'video— принимает видео любого формата;/ *' 'image— принимает изображения любого формата;/ *' 'image— JPEG изображения;/ jpeg' 'image— PNG изображения;/ png' 'application— PDF документы;/ pdf' 'audio— MP3 аудиофайлы;/ mpeg' 'video— MP4 видеофайлы;/ mp4' - строка типа MIME без расширений;
- расширения файла, перед которыми стоит точка, например,
.jpg,.pdf,.docxи так далее.
Можно указать несколько значений, а ещё их можно сочетать:
<input type="file" name="cat-pic-video" accept="video/*, .jpg, .jpeg, .png">
<input
type="file"
name="cat-pic-video"
accept="video/*, .jpg, .jpeg, .png"
>
Также комбинировать MIME-типы и расширения файлов для большей гибкости:
<input type="file" name="documents" accept=" .pdf, application/msword, application/vnd.openxmlformats-officedocument.wordprocessingml.document ">
<input
type="file"
name="documents"
accept="
.pdf,
application/msword,
application/vnd.openxmlformats-officedocument.wordprocessingml.document
"
>
Атрибут accept не принимает произвольные строки, не соответствующие форматам MIME или файловым расширениям. Например, значение text без указания расширения или MIME-типа будет недействительным.
Демонстрация работы
СкопированоТут можно пощупать как браузер ведёт себя с расширениями для всех типов избражений, видео и определёнными расширениями документов:
А тут с определёнными расширениями изображений:
Ограничения
Скопировано- Поддержка браузерами: некоторые старые браузеры могут не поддерживать атрибут
acceptполностью, особенно когда дело касается сложных комбинаций MIME-типов и расширений файлов. Стоит проверить поддержку атрибута в конкретных браузерах на Can I Use. - Отсутствие фильтрации на клиенте: атрибут
acceptне предотвращает загрузку неподходящих файлов. Это только ориентир для диалогового окна выбора файлов. - Требуется серверная проверка: необходимо реализовать проверку типов файлов на стороне сервера для обеспечения безопасности и корректной работы приложения.
Использование с другими атрибутами
СкопированоАтрибут multiple: позволяет пользователю выбрать несколько файлов.
<input type="file" name="cat-pictures" accept=".jpg, .jpeg, .png" multiple>
<input
type="file"
name="cat-pictures"
accept=".jpg, .jpeg, .png"
multiple
>
Атрибут required: указывает, что поле обязательно для заполнения.
<input type="file" name="cat-picture" accept=".jpg, .jpeg, .png" required>
<input
type="file"
name="cat-picture"
accept=".jpg, .jpeg, .png"
required
>
Подсказки
Скопировано💡 Что делать, если у пользователя несколько котов и он хочет показать вам всех? Поможет атрибут multiple.
На практике
Скопированосоветует
Скопировано🛠️ Для улучшения пользовательского опыта можно использовать JavaScript для предварительной проверки выбранных файлов до отправки формы.
Пример:
document.getElementById('cat-picture').addEventListener('change', function() { const file = this.files[0] if (file && !file.type.match('image.*')) { alert('Пожалуйста, выберите изображение.') this.value = '' }})
document.getElementById('cat-picture').addEventListener('change', function() {
const file = this.files[0]
if (file && !file.type.match('image.*')) {
alert('Пожалуйста, выберите изображение.')
this.value = ''
}
})
🛠 В современных фреймворках, таких как React или Vue, можно интегрировать атрибут accept напрямую в ваш компонентный подход.
Например, в React компоненте это может выглядеть так:
function UploadForm() { return ( <form method="post"> <label htmlFor="cat-picture">Прикрепите фото кота</label> <input type="file" id="cat-picture" name="cat-picture" accept=".jpg, .jpeg, .png" /> <button>Прикрепить</button> </form> );}
function UploadForm() {
return (
<form method="post">
<label htmlFor="cat-picture">Прикрепите фото кота</label>
<input
type="file"
id="cat-picture"
name="cat-picture"
accept=".jpg, .jpeg, .png"
/>
<button>Прикрепить</button>
</form>
);
}