Как получить входной файл html5 для одновременного приема только определенных типов файлов в браузерах?

В соответствии с этим ответом на переполнение стека мы можем установить атрибут accept для <input type="file" /> для фильтрации принятого ввода следующим образом:

accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel"

Однако, поскольку вы можете заметить запуск простого фрагмента ниже, Chrome 43.0.something появляется просто игнорировать эту конфигурацию, в то время как это прекрасно понимается Firefox 39,0.

Я решил переключиться на более грубый подход, используя:

accept=".xls, .xlsx"

... который отлично работает в Chrome, но делает Firefox несколько запутанным, принимая только файлы с расширением .xlsx.


Учитывая, что это, вероятно, очень распространенное и основное, я должен что-то упустить: где я напортачиваюсь? Как получить входной файл html5, чтобы предлагать только файлы .xls и .xlsx последовательно в браузерах?

Вот фрагмент кода, иллюстрирующий мою проблему (наряду с ссылка JSFiddle, если вы хотите поиграть с ней).

Accepts application/vnd.ms-excel and the likes:<br />
<label for="file1">File input</label>
<input type="file" name="file1" accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel"/>
<hr />
Accepts .xls and .xlsx:<br />
<label for="file2">File input</label>
<input type="file" name="file2" accept=".xls, .xlsx"/>

Ответы

Ответ 1

Перенесите их как mime-тип, так и расширение

<input type="file" name="file2" accept="text/csv, .csv"/>

Ответ 2

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Это не ответ каким-либо образом, а просто примечание потенциальным другим читателям, пытающимся использовать этот атрибут неправильно.


В эта неофициальная ссылка W3C атрибута accept вы можете найти следующее:

Совет. Не используйте этот атрибут в качестве инструмента проверки. Загрузка файлов должна быть проверена на сервере.

не рекомендуется использовать этот атрибут для проверки, поскольку пользователи могут каким-то образом обойти его, а не все браузеры ведут себя одинаково.

Ответ 3

Во-первых: у вас определенно есть html5 doctype?

<!DOCTYPE html>

Потому что, если вы этого не сделали, это может не работать в некоторых местах.

Во-вторых: вместо использования html вы можете использовать javascript или jquery. См. Этот вопрос/ответ: jquery - проверьте расширение файла перед загрузкой

В-третьих: По моему опыту, некоторые материалы html5 просто не работают. Я не знаю, почему, но возникает необходимость обойти проблемы с помощью jquery, например.

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