Обмеження розміру URL-адреси протоколу даних


79

Чи існує обмеження розміру для значень схеми URL "data:"? Мене цікавлять обмеження в популярних веб-браузерах. Іншими словами, скільки часу може data:image/jpg;base64,base64_encoded_dataбути в <img src="data:image/jpg;base64,base64_encoded_data" />або background-image: url(data:image/jpg;base64,base64_encoded_data)?

Відповіді:


4

Щодо обмежень у веб-браузерах, MSIE 6/7 не підтримує схему URL-адрес даних ... Більше інформації на wikipedia

Обмеження довжини різні для кожного браузера - я вважаю, що IE8 дозволяє до 32 КБ, а опера - 4 КБ, але не можу сказати про інші браузери ...


100

Коротка відповідь: Обмеження URI даних змінюється.

Відповідей дуже багато. Оскільки запитання було задано 5 років тому, більшість із них є неправильними через те, що вони втратили дату, однак це питання стоїть у верхній частині результатів пошуку Google за "обмеженням uri даних". URI даних зараз широко підтримується, і IE 7/8 більше не є відповідним браузером. Нижче є багато посилань, оскільки сьогодні відповідь нюансована.

Обмеження URI даних

Специфікація URI даних не визначає обмеження розміру, але каже, що програми можуть накладати свої власні.

  • Chrome - 2 МБ для поточного документа. В іншому випадку обмеження - це обмеження в пам’яті для довільних крапок: якщо x64, а НЕ ChromeOS чи Android, то 2 Гб; інакше, total_physical_memory / 5( джерело ).
  • Firefox - необмежений
  • IE ≥ 9 & Edge - 4 Гб
  • Safari & Mobile Safari -?

Альтернативи

Однією з технологій з вищим обмеженням (500 Мб у Chrome), яка може бути альтернативою для вашого випадку використання, є URL-адреси BLOB- об'єктів через URL.createObjectURL (), що використовують URL-адреса API разом із BLOB- файлами через API файлів . Приклад цього наведено у розділі Використання URL.createObjectURL () .

Кілька інших альтернатив , як згадувалося в Як записати файл / передати його користувачеві , є: FileSaver.js , StreamSaver.js і JSZip .

Ви можете використовувати Modernizr для виявлення підтримки для URI даних понад 32 кб .

Пов’язані запитання

Ці відповіді майже однакові з цим запитанням, але я згадую їх, щоб заощадити час на читання кожного з них.


Обмеження Chrome перевищує 2 Мб, хоча я точно не знаю, що таке обмеження. Здається, це також працює набагато краще для вбудованих зображень у HTML-документах, ніж URI даних, введені в адресний рядок, що майже зупинило Chrome на 3 Мб, але обидва працювали.
Джордж Геляр

1
@GeorgeHelyar Дякуємо за додавання цього. Будь-який шанс, що ви могли б надати посилання на більший номер для вбудованого корпусу?
Тейлор Едмістон,

У мене немає посилання, лише емпіричні докази. Я перетворив зображення розміром 3 Мб на URI даних і використав його як img src у html.
Джордж Геляр

1
@GeorgeHelyar Я радий додати емпіричні докази, якщо ви можете їх підкинути в скрипці js тощо
Тейлор Едмістон,

1
Обмеження Chrome стосується лише URL-адреси документа, в якому ви перебуваєте. Ви можете дуже добре завантажувати відеофайли як dataURI, якщо у вашому пристрої достатньо пам’яті. І називати createObjectURL "експериментальною технологією" у 2017 році - це ...
Kaiido

44

Я щойно здійснив швидку перевірку, вбудувавши вісім різних зображень у форматі Jpeg розміром від 3844 до 2233766 байт .

Усі перелічені нижче браузери правильно відображали кожне зображення в моїй системі Windows 7 (64-розрядна):

  • Хром 14.0.816.0
  • Firefox 11.0
  • Google Chrome 18.0.1025.142
  • Internet Explorer 9.0.5 (64 біт)
  • Опера 11.62
  • Safari 5.1.5

3
Мій IE9 тим часом став IE10, тому можу лише запевнити вас, що він працював у IE9. І це все ще працює в IE10. Тут тестове зображення приблизно 244 Кбайт (подивіться на джерело) butterweck.de/test/dataimgtest.html
miasbeck

10
@miasbeck, Чому зупинятися на 2 Мб?
Pacerier 03.03.15

@Pacerier Немає конкретної причини. Це був лише максимальний розмір, який, на мою думку, мав би бути у моїх зображень.
miasbeck

Дійсно, мій IE (11. *) також кидає зображення.
Алексіс Пакес,

І додаткова дещо езотерична точка даних. Якщо ви випадково використовуєте URI даних для передачі даних зображень на Chromecast (наприклад, обкладинка альбому), максимально підтримувана довжина становить 64 000 байт ( не 64 КБ).
aroth

18

З http://www.ietf.org/rfc/rfc2397.txt :

Схема URL-адреси "data:" корисна лише для коротких значень. Зверніть увагу, що деякі програми, які використовують URL-адреси, можуть встановлювати обмеження довжини; наприклад, URL-адреси, вбудовані в <A>прив'язки в HTML, мають обмеження довжини, визначене декларацією SGML для HTML [RFC1866]. LITLEN (1024) обмежує кількість символів, які можуть відображатися в одному літералі значення атрибута, ATTSPLEN (2100) обмежує суму всіх довжин усіх специфікацій значення атрибутів, які відображаються в тезі, а TAGLEN (2100) обмежує загальна довжина тегу.


1
Схоже, "дані" марні в класичному HTML. Однак XHTML та CSS можуть мати різні обмеження
LicenseQ

Ви хочете знайти схему для XHTML і специфікацію для CSS і дізнатися.
Джон Сондерс,

2
Хоча читати специфікацію цікаво, намагатися залишатись у ній, правда, не мудро. Ми як веб-розробники, від самої нашої природи, завжди на передовій технологій. Якщо ви залишаєтесь в межах специфікації, ви без потреби стримуєтесь. LicenseQ абсолютно правий, що URL-адреси даних будуть абсолютно марними при цих обмеженнях. Але вони не є марними, і обмеження насправді не є обмеженнями (як підтверджують усі постачальники браузерів, ігноруючи їх). Тож звільняйся! Використовуйте інформацію з miasbeck у своїх інтересах. З практичної реальності живуть наші програми.
Stijn de Witt

@StijndeWitt, точно. "Відповідь" на веб-запитання без розмови про поведінку будь-якого браузера - це зовсім не відповідь.
Пейс’єр


6

Відповідь 2017 року: перетворити дані: на BLOB із функцією: dataURLtoBlob

function dataURLtoBlob(dataurl) {
    var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
        bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
    while(n--){
        u8arr[n] = bstr.charCodeAt(n);
    }
    return new Blob([u8arr], {type:mime});
}

потім створіть BLOB-адресу

var temp_url = window.URL.createObjectURL(blob);

тоді скористайтеся ним у новому вікні, якщо вам потрібно.

var redirectWindow = window.open('');
redirectWindow.document.write('<iframe src="' + temp_url + '" frameborder="0" style="border:0; top:0px; left:0px; bottom:0px; right:0px; width:100%; height:100%;" allowfullscreen></iframe>')      

працює з великими файлами в chrome / firefox 2017


1
window.open(temp_url, '_blank');Здається, це теж працює без необхідності вбудованих фреймів тощо. Одне, на що слід звернути увагу, - це те, що Chrome не дозволяє Файл> Зберегти як на URL-адресах BLOB.
Джоел

Оскільки charCodeAtне перетворює всі символи правильно, я рекомендую використовувати new TextEncoder('utf-8').encode. Я наводжу приклад у своєму дописі.
виберіть

Я не зіткнувся з жодною проблемою з використанням charCodeAt. Я використовував рішення waza123, і воно чудово працює.
ashilon,


2

Будучи просто досвідченим, я зміг завантажити зображення розміром 130 Кб, використовуючи URL-адресу даних у Firefox 3.5 із виклику JavaScript ajax. Це скоротило зображення в IE 8, але все це з’явилося у FF.


1

Здається, обмеження у Firefox 3.6 становить 600 КБ.


1
Будь-які посилання на це резервне копіювання?
xdhmoore

Ось посилання, яке показує ліміт Firefox: developer.mozilla.org/en-US/docs/Web/HTTP/data_URIs (Шукайте обмеження)
Carlitos Way

@CarlitosWay Не можу знайти там.
FluorescentGreen5

@ FluorescentGreen5, який був 2 роки тому, я вважаю, що характеристики Firefox змінилися ...
Carlitos Way

1
@CarlitosWay Ах, я щойно перевірив специфікацію, і там написано, що зараз вона необмежена.
FluorescentGreen5

1

Я спробував код із waza123, але charCodeAtметод перетворив не всі символи правильно. Ось моє рішення для створення великих завантажень у браузері. (Я використовував його для даних JSON)

function exportToFile(jsonData, fileName) {
    const u8arr = new TextEncoder('utf-8').encode(JSON.stringify(jsonData, null, 2));
    const url = window.URL.createObjectURL(new Blob([u8arr], { type: 'application/json' }));
    const element = document.createElement('a');
    element.setAttribute('href', url);
    element.setAttribute('download', fileName);
    element.style.display = 'none';
    document.body.appendChild(element);
    element.click();
    document.body.removeChild(element);
}

1
Це спрацювало для мене. Мені просто потрібно було встановити введення тексту TextEncoder для мого кутового додатка: npm install --save @ types / text-encoding
jokab

0

Примітка. У IE є деякі додаткові обмеження. Для iframe обмеження становить 4 кб.

У IE9 обмежено 32 кб для DataURI, хоча з міркувань безпеки їх використання залишається обмеженим певним контекстом (зокрема, сценарії, що створюють контекст безпеки, наприклад IFRAMES, заборонені)

MSDN

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.