Как создать data URI
- Выберите режим. Из текста (по умолчанию) кодирует то, что вы ввели или вставили. Из файла принимает перетащенный, вставленный или выбранный файл любого типа. Разобрать работает в обратную сторону и раскладывает URI на части.
- В режиме Из текста задайте MIME-тип (например,
text/cssилиapplication/json), Кодировку и Кодирование: Base64 или URL-кодирование. В режиме Из файла MIME-тип подставляется из файла, и его можно поправить. - Выберите Формат вывода: Data URI, CSS
url(), HTML<a>с именем для скачивания или Markdown. Для картинок появляется HTML<img>, а для шрифтов@font-face. - Нажмите Скопировать результат. Скачать файл сохраняет сами данные, а Сохранить как .txt сохраняет текст результата.
Под кнопками Данные показывают размер данных, Длина URI размер результата, а Накладные расходы разницу в процентах.
Синтаксис data URI
Data URI упаковывает целый файл в URL:
data:[<media type>][;charset=<charset>][;base64],<data>
| Часть | Пример | Примечания |
|---|---|---|
| тип данных | image/png, text/css | необязателен; пустой означает text/plain;charset=US-ASCII |
| параметры | ;charset=utf-8 | для текстовых типов; допустимы и другие пары ;key=value |
;base64 | ;base64 | данные в Base64; без него данные в percent-encoding |
| данные | после запятой | содержимое |
Несколько проверенных примеров:
| Data URI | Содержит |
|---|---|
data:,Hello%2C%20World%21 | текст Hello, World!, тип по умолчанию |
data:text/plain;charset=utf-8;base64,SGVsbG8sIFdvcmxkIQ== | тот же текст в Base64 |
data:text/css,body%7Bcolor:%23333%7D | CSS-правило в URL-кодировании |
data:application/json;base64,eyJvayI6dHJ1ZX0= | {"ok":true} |
Запятая обязательна, даже если данных нет: data:, считается корректным пустым URI.
Base64 или URL-кодирование
Оба способа дают корректный URI; они различаются размером и читаемостью.
| Данные | URI в Base64 | URI в URL-кодировании |
|---|---|---|
Hello, World! как text/plain;charset=utf-8 | 57 символов | 45 символов |
body{color:#333} как text/css | 45 символов | 36 символов |
{"ok":true} как application/json | 45 символов | 41 символ |
<h1>Héllo</h1> как text/html;charset=utf-8 | 56 символов | 56 символов |
Простой ASCII-текст в URL-кодировании короче, и его можно прочитать в исходниках. Каждый не-ASCII байт стоит трёх символов (é становится %C3%A9), поэтому для текста на других алфавитах, включая кириллицу, быстро выигрывает Base64. Для картинок, шрифтов, PDF и других двоичных файлов используйте Base64; генератор предупредит, если выбрать для двоичных данных URL-кодирование.
URL-кодирование здесь консервативное: буквы, цифры и - . _ ~ ! $ * + , ; = : @ / ? остаются как есть, всё остальное экранируется, включая #, %, кавычки, скобки и пробелы. Неэкранированный # оборвал бы URI, потому что браузеры читают его как начало фрагмента. Для SVG есть третий, более короткий вариант на странице SVG в data URI.
Где работают data URI
- Картинки в
<img src>, CSSbackground-image,<link rel="icon">иposterу видео. - Шрифты в
srcу@font-face; это удобно для одного маленького иконочного шрифта. Если MIME-тип относится к шрифтам, генератор соберёт правило сам. - Скачивания через
<a href="data:..." download="report.csv">: так отдают файлы, которые создаются на странице без сервера. - Стили и скрипты, загружаемые через
<link href>или<script src>, если Content Security Policy страницы разрешает для нихdata:. - Тестовые фикстуры и JSON-данные, которым нужен небольшой файл прямо внутри.
Работают они не везде. Chrome и Firefox блокируют переход всей вкладки на URL data: по инициативе страницы, поэтому ссылка на data:text/html,... по клику ничего не делает. Content Security Policy должна указывать data: в img-src, font-src или соответствующей директиве. Многие веб-почты, включая Gmail, полностью вырезают картинки в data URI; см. статью Base64 в электронной почте.
Размер и производительность
Base64 увеличивает двоичные данные примерно на 33%, а URI повторяется на каждой странице или в каждом файле стилей, где он есть, и не получает собственной записи в кеше. Для небольших ресурсов в несколько килобайт это выгодно, для фотографий невыгодно. Цифры разобраны в статье о производительности data URI. Для картинок есть Картинка в Base64, где перед кодированием можно уменьшить и сконвертировать изображение.
Создание data URI в коде
Текст в URL-кодировании на JavaScript:
const uri = "data:text/plain;charset=utf-8," + encodeURIComponent("Prices: 5 € & up");
// data:text/plain;charset=utf-8,Prices%3A%205%20%E2%82%AC%20%26%20up
JSON в Base64 на Python:
import base64, json
obj = {"name": "Ada", "langs": ["en", "fr"]}
uri = "data:application/json;base64," + base64.b64encode(json.dumps(obj).encode()).decode()
# data:application/json;base64,eyJuYW1lIjogIkFkYSIsICJsYW5ncyI6IFsiZW4iLCAiZnIiXX0=
Подробнее в статьях Base64 в JavaScript и Base64 в Python. Чтобы разобрать data URI, найденный где-то ещё, используйте парсер data URI.
Вопросы и ответы
Чем data URI отличается от data URL?
На практике ничем. RFC 2397 называет это схемой URL «data», браузеры и стандарт Fetch говорят data URL, а название data URI старше и встречается не реже. Синтаксис data: у них один.
Когда использовать URL-кодирование вместо Base64?
Для короткого текста, в основном из ASCII, вроде CSS, JSON или SVG, URL-кодирование часто короче и остаётся читаемым. Для двоичных файлов Base64 всегда компактнее: percent-encoding превращает большинство байтов в три символа.
Нужен ли ;charset=utf-8 в data URI?
Нужен, если в тексте есть хотя бы один не-ASCII символ. Без него data URI с text/plain по умолчанию считается US-ASCII, и é или € могут превратиться в два-три неправильных символа. Картинкам и другим двоичным типам кодировка не нужна.
Почему клик по моей data:-ссылке ничего не открывает?
Chrome и Firefox не дают страницам открывать URL data: во всю вкладку, потому что этим массово пользовались для фишинга. Картинки, стили, шрифты и скачивания через <a download> по-прежнему работают.
Есть ли ограничение на размер data URI?
Ограничения в браузерах разные и для картинок щедрые, но очень длинные URI замедляют страницы, а некоторые инструменты их обрезают. Генератор предупреждает, если больше 2 MB; для таких объёмов лучше сослаться на файл.