21.12.2009

input type="file" multiple

Оказывается, Safari 4, Chrome 3 и Firefox 3.6 Beta 4 поддерживают выбор сразу нескольких файлов с помощью атрибута multiple.

<input name="att" type="file" multiple="true"/>

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

Еще более удивительно то, что Opera уже давно поддерживает multiple-файлы с помощью атрибутов min и max.

<input name="att" type="file" min="1" max="99"/>

При этом в Опере меняется название кнопки.

Обычный инпут:

С атрибутами min и max:

Очень хочется верить, что multiple заимплементируют в IE 9. Тогда можно будет, наконец, полностью отказаться от дурацкой флешки.

6 комментариев:

besisland.name комментирует...

Что значит «тогда можно будет наконец»? Тут вон IE 6 вышел восемь лет назад, а до сих пор приходится учитывать его пользователей.

Степан Резников комментирует...

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

Я думаю, для многих сайтов будет вполне приемлемо использовать только нативную поддержку multiple-выбора файлов. В старых браузерах будет по-прежнему работать выбор файлов по одному. Graceful degradation.

parpalak комментирует...

Спасибо за описание. Я проверил, как работает прием нескольких файлов на сервере. Из Хрома всё загружается, а вот Опера посылает данные в каком-то странном формате, который не распознается PHP, и в результате массив $_FILES пустой, а массив $_POST содержит следующее:

Array
(
[pictures] => Array
(
[0] => ------------PHZ0n36koOH0nyhyVrvxMe
Content-Disposition: form-data; name="pictures[]"; filename="file1.txt"
Content-Type: application/octet-stream

Содержимое 1

------------PHZ0n36koOH0nyhyVrvxMe
Content-Disposition: form-data; name="pictures[]"; filename="file2.txt"
Content-Type: application/octet-stream

Содержимое 2

------------PHZ0n36koOH0nyhyVrvxMe--

)
)

Гугл пока не помог. Случайно не знаете, как это можно исправить, чтобы вручную не парсить?

Степан Резников комментирует...

@parpalak:

Да, я тоже столкнулся с этой проблемой в Опере. Вот что я нагуглил:

http://bugs.php.net/bug.php?id=47789
http://bugs.php.net/bug.php?id=49196
http://www.rhinocerus.net/forum/lang-perl-misc/581518-process-upload-multiple-files-single-input-type-file.html

Нормального простого решения пока не нашел. Если найду, обязательно поделюсь.

parpalak комментирует...

А я вот это нашел: http://habrahabr.ru/blogs/webdev/76749/

В стандарте написано следующее:
If multiple files are to be returned as the result of a single form entry, they should be represented as a "multipart/mixed" part embedded within the "multipart/form-data".

Выходит, Опера работает в рамках стандарта, отсылая файлы в multipart/mixed, а PHP такое не понимает. Разработчики PHP еще в марте не захотели исправлять баг 47789. В общем, неясно, когда исправят.

А еще получается, что FF и Safari/Chrome нарушают эту рекомендацию из стандарта. Возможно, чтобы не было подобных проблем, как у Оперы с PHP.

Александр комментирует...

Это все конечно очень круто. Но чет у меня не получается получить эти файлы на asp.net 1.1 Может кто нибудь помочь