Кратко
- Атрибут
downloadпозволяет странице попросить сохранить ресурс и предложить имя; HTTP-ответ сервера может прислать собственное предложение. - Архив Mozilla за 2013 год и обсуждение WHATWG за 2017 год показывают, как граница между сайтами усложнила обычный щелчок.
У файла, попавшего в папку «Загрузки», есть имя. Обычно на него смотрят один раз — когда ищут документ. А ведь до этого к воображаемой бирке тянулись сразу несколько рук. Страница написала на кнопке «Скачать» и могла предложить имя в HTML. Сервер прислал содержимое и мог вложить свою записку в HTTP. Браузеру досталась практическая часть: создать файл на машине пользователя. В этой маленькой логистике и прячется история одного атрибута.
Серверная записка получила подробные правила в RFC 6266, опубликованном в июне 2011 года. Заголовок Content-Disposition с attachment направляет ответ на сохранение. Параметр filename предлагает название, а filename* помогает передать символы разных языков. Стандарт называет такое название рекомендацией. Получатель должен отрезать части пути, которые могли бы указать чужой каталог, учитывать опасные расширения и обезвреживать запутывающие символы. Записка на посылке ещё не даёт отправителю ключ от домашнего шкафа.
У страницы появился свой способ заговорить о скачивании. Список возможностей Chromium отмечает a[download] с этапа M14. Разметка ссылки может просить браузер сохранить ресурс вместо перехода к нему, а значение атрибута предлагает локальное имя. Для графика, документа или созданного в браузере файла это удобная возможность. Но ссылка на странице одного сайта может указывать на файл другого. У кнопки и байтов оказываются разные хозяева.
Именно такую ситуацию описывает заявка Mozilla 2013 года. Ссылка на изображение с другого сайта содержит download="filename.png"; Firefox показывает картинку, Chrome сохраняет её. Автор заявки счёл разницу ошибкой. Ответ Mozilla назвал поведение Firefox необходимой мерой безопасности, и заявку закрыли. За одинаковым видом ссылки скрывался вопрос: вправе ли одна страница распоряжаться тем, как содержимое чужого сайта окажется на компьютере читателя?
В апреле 2017 года обсуждение WHATWG разобрало расхождение ещё точнее. Firefox и Safari тогда игнорировали атрибут для указанной межсайтовой ситуации. Chrome запускал сохранение, но отбрасывал имя, предложенное страницей. Редактор стандарта заметил, что тогдашний алгоритм допускал оба исхода, и предложил стремиться к единообразию. Решить «скачивать ли» и решить «как назвать» оказалось двумя разными задачами. В том же году WebKit объявил о поддержке атрибута в Safari 10.1 для macOS, включая сохранение Blob, созданных самой страницей. Полезность функции была очевидна, а границы продолжали уточнять.
Нынешний стандарт HTML формулирует роли прямо. download выражает намерение автора страницы и может рекомендовать имя. Имя из серверного Content-Disposition способно его заменить. Для ресурса с другого origin важен ответ сервера с attachment: он подтверждает намерение отдавать файл на скачивание и защищает от неожиданных загрузок, навязанных чужой страницей. Затем браузер выбирает безопасное локальное имя и место.
Бирка в папке «Загрузки» оказывается протоколом переговоров. Страница собирает витрину, сервер отправляет товар, браузер принимает его у порога компьютера. В хорошем случае никто не слышит их короткого спора. На диске остаётся только файл — и имя, за которое кто-то в итоге взял ответственность.
Обзор для участников
Подробный контекст профиля
Войдите с подходящим уровнем подписки, чтобы открыть полный обзор и примечания к источникам.
Только для Стратегического сообщества
Стратегическое сообщество
Открыто всем читателям. Вступите и войдите, чтобы открыть обзоры профилей.
Вступить в Стратегическое сообществоТолько для Альянса лидеров
Альянс лидеров
Для проверенных владельцев IP-активов и руководителей. Войдите, чтобы открыть обзоры Альянса.
Вступить в Альянс лидеров





