Einschränkungen der URL-Größe des Datenprotokolls

79

Gibt es eine Größenbeschränkung für URL-Schemawerte für "Daten:"? Ich interessiere mich für Einschränkungen in gängigen Webbrowsern. Mit anderen Worten, wie lange kann data:image/jpg;base64,base64_encoded_datain <img src="data:image/jpg;base64,base64_encoded_data" />oder sein background-image: url(data:image/jpg;base64,base64_encoded_data)?

LicenseQ
quelle

Antworten:

4

In Bezug auf Einschränkungen in Webbrowsern unterstützt MSIE 6/7 das Daten-URL-Schema nicht ... Weitere Informationen auf Wikipedia

Die Längenbeschränkungen sind je nach Browser unterschiedlich - ich glaube, IE8 erlaubt bis zu 32 KB und die Oper ist 4 KB groß, kann aber nicht wirklich etwas über andere Browser sagen ...

JC Inacio
quelle
99

Kurze Antwort: Das Daten-URI-Limit variiert.

Es gibt viele Antworten. Da die Frage vor mehr als 5 Jahren gestellt wurde, sind die meisten jetzt falsch, da sie veraltet sind. Diese Frage steht jedoch ganz oben in den Google-Ergebnissen für "Daten-Uri-Limit". Daten-URIs werden jetzt weitgehend unterstützt und IE 7/8 ist kein relevanter Browser mehr. Es gibt viele Referenzen unten, weil die Antwort heute nuanciert ist.

Daten-URI-Grenzwerte

Die Daten-URI-Spezifikation definiert keine Größenbeschränkung, sagt jedoch, dass Anwendungen möglicherweise ihre eigenen auferlegen.

  • Chrome - 2 MB für das aktuelle Dokument. Andernfalls ist das Limit das speicherinterne Speicherlimit für beliebige Blobs: Wenn x64 und NICHT ChromeOS oder Android, dann 2 GB; sonst total_physical_memory / 5( Quelle ).
  • Firefox - unbegrenzt
  • IE ≥ 9 & Edge - 4 GB
  • Safari & Mobile Safari -?

Alternativen

Eine Technologie mit einer höheren Grenze (500 MB in Chrome) , die möglicherweise eine Alternative für Ihren Anwendungsfall darstellt, sind Blob-URLs über URL.createObjectURL () , die die URL-API zusammen mit Blobs über die Datei-API verwenden . Ein Beispiel hierfür finden Sie unter Verwenden von URL.createObjectURL () .

Einige andere Alternativen, wie unter Schreiben einer Datei / Geben an den Benutzer erwähnt, sind: FileSaver.js , StreamSaver.js und JSZip .

Mit Modernizr können Sie die Unterstützung von Daten-URIs über 32 KB erkennen .

Verwandte Fragen

Diese Antworten sind so ziemlich die gleichen wie diese Frage, aber ich erwähne sie, um Ihnen die Zeit zu ersparen, die Sie beim Lesen der einzelnen Fragen haben.

Taylor Edmiston
quelle
Das Limit von Chrome beträgt mehr als 2 MB, obwohl ich nicht genau weiß, wie hoch das Limit ist. Es scheint auch für eingebettete Bilder in HTML-Dokumenten viel besser zu funktionieren als Daten-URIs, die in die Adressleiste eingegeben wurden, wodurch Chrome bei 3 MB fast zum Erliegen kam, aber beide funktionierten.
George Helyar
1
@ GeorgeHelyar Danke, dass du das hinzugefügt hast. Gibt es eine Möglichkeit, einen Verweis auf die höhere Nummer für den eingebetteten Fall anzugeben?
Taylor Edmiston
Ich habe keine Referenz, nur empirische Beweise. Ich habe ein 3-MB-Bild in einen Daten-URI konvertiert und es als img src in HTML verwendet.
George Helyar
1
@ GeorgeHelyar Ich bin glücklich, die empirischen Beweise hinzuzufügen, wenn Sie es in einer js Geige usw. werfen können
Taylor Edmiston
1
Das Chrome-Limit gilt nur für die URL des Dokuments, in dem Sie sich befinden. Sie können Gigs of Video sehr gut als dataURI laden, wenn Ihr Gerät über genügend Speicher verfügt. Und createObjectURL 2017 als "experimentelle Technologie" zu bezeichnen, ist ...
Kaiido
44

Ich habe gerade eine kurze Überprüfung durchgeführt, bei der acht verschiedene JPEG-Bilder mit einer Größe von 3.844 bis 2.233.076 Byte eingebettet wurden .

Alle folgenden Browser haben jedes Bild auf meinem Windows 7 -System (64-Bit) korrekt angezeigt :

  • Chrom 14.0.816.0
  • Firefox 11.0
  • Google Chrome 18.0.1025.142
  • Internet Explorer 9.0.5 (64 Bit)
  • Opera 11.62
  • Safari 5.1.5
Miasbeck
quelle
3
Mein IE9 ist inzwischen IE10 geworden, kann Ihnen also nur versichern, dass es in IE9 funktioniert hat. Und es funktioniert immer noch in IE10. Hier ein Testbild von ca. 244 KByte (siehe Quelle) butterweck.de/test/dataimgtest.html
miasbeck
10
@miasbeck, warum bei 2 MB aufhören?
Pacerier
@ Pacerier Kein besonderer Grund. Es war nur die maximale Größe, die meine Bilder wahrscheinlich haben würden.
Miasbeck
In der Tat wirft mein IE (11. *) auch das Bild.
Alexis Paques
Und ein zusätzlicher etwas esoterischer Datenpunkt. Wenn Sie Daten-URIs verwenden, um Bilddaten an einen Chromecast zu übergeben (z. B. Albumcover), beträgt die maximal unterstützte Länge 64.000 Byte ( nicht 64 KB).
Am
18

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

Das URL-Schema "data:" ist nur für kurze Werte nützlich. Beachten Sie, dass einige Anwendungen, die URLs verwenden, möglicherweise eine Längenbeschränkung festlegen. Beispielsweise haben URLs, die in <A>Anker in HTML eingebettet sind, eine Längenbeschränkung, die durch die SGML-Deklaration für HTML [RFC1866] festgelegt wird. Der LITLEN (1024) begrenzt die Anzahl der Zeichen, die in einem einzelnen Attributwertliteral erscheinen können, der ATTSPLEN (2100) begrenzt die Summe aller Längen aller Attributwertspezifikationen, die in einem Tag erscheinen, und der TAGLEN (2100) begrenzt die Gesamtlänge eines Tags.

John Saunders
quelle
1
Sieht aus wie "Daten", die in klassischem HTML nutzlos sind. XHTML und CSS können jedoch unterschiedliche Einschränkungen haben
LicenseQ
Sie möchten das Schema für XHTML und die Spezifikation für CSS suchen und herausfinden.
John Saunders
2
Während das Lesen der Spezifikation interessant ist, ist es imho nicht klug, darin zu bleiben. Wir sind als Webentwickler von Natur aus immer auf dem neuesten Stand der Technik. Wenn Sie innerhalb der Spezifikation bleiben, halten Sie sich unnötig zurück. LicenseQ hat völlig Recht, dass Daten-URLs mit diesen Einschränkungen völlig unbrauchbar wären. Aber sie sind nicht nutzlos und die Grenzen sind nicht wirklich Grenzen (wie alle Browser-Anbieter beweisen, indem sie sie ignorieren). Also mach dich frei! Nutzen Sie die Informationen von miasbeck zu Ihrem Vorteil. Es ist aus der praktischen Realität, in der unsere Programme leben.
Stijn de Witt
@StijndeWitt, genau. Eine "Antwort" auf eine Webfrage, ohne über das Verhalten eines Browsers zu sprechen, ist überhaupt keine Antwort.
Pacerier
6

Die Antwort für 2017 lautet: Daten konvertieren: in Blob mit der Funktion: 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});
}

Erstellen Sie dann eine Blob-URL

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

Verwenden Sie es dann in einem neuen Fenster, wenn Sie es benötigen.

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>')      

funktioniert mit großen Dateien in Chrome / Firefox 2017

waza123
quelle
1
window.open(temp_url, '_blank');Scheint auch ohne Iframes usw. zu funktionieren. Beachten Sie, dass Chrome Datei> Speichern unter für Blob-URLs nicht zulässt.
Joel
Da charCodeAtnicht alle Zeichen korrekt konvertiert werden, empfehle ich die Verwendung new TextEncoder('utf-8').encode. Ich gebe ein Beispiel in meinem Beitrag.
wählen
Ich hatte kein Problem mit charCodeAt. Ich habe die Lösung von waza123 verwendet und sie funktioniert hervorragend.
Ashilon
5

Es ist wirklich das " Daten-URI-Schema ".

Laut der Wikipedia-Seite wird IE7 nicht unterstützt, und IE8-Betas beschränken es auf 32 KB Daten.

Jay Kominek
quelle
2

Nur zu Ihrer Information, ich konnte ein 130K-Bild mithilfe einer Daten-URL in Firefox 3.5 aus einem JavaScript-Ajax-Aufruf laden. Das Bild wurde in IE 8 abgeschnitten, aber das Ganze wurde in FF angezeigt.

Brad Broerman
quelle
1

In Firefox 3.6 scheint das Limit 600 KB zu betragen.

Riatre
quelle
1
Irgendwelche Links, um dies zu sichern?
xdhmoore
Hier ist ein Link, der das Firefox-Limit anzeigt: developer.mozilla.org/en-US/docs/Web/HTTP/data_URIs (Nach Einschränkungen
suchen
@CarlitosWay Kann es dort nicht finden.
FluorescentGreen5
@ FluorescentGreen5, das vor 2 Jahren war, ich glaube, die Spezifikation von Firefox hatte sich geändert ...
Carlitos Way
1
@CarlitosWay Ah, ich habe gerade die Spezifikation überprüft und es heißt, dass sie jetzt unbegrenzt ist.
FluorescentGreen5
1

Ich habe den Code von waza123 ausprobiert, aber die charCodeAtMethode hat nicht alle Zeichen korrekt konvertiert. Hier ist meine Lösung zum Erstellen großer Downloads im Browser. (Ich habe es für JSON-Daten verwendet)

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);
}
wählen
quelle
1
Das hat bei mir funktioniert. Ich musste nur TextEncoder-Typisierungen für meine eckige App installieren: npm install --save @ types / text-encoding
jokab
0

Hinweis: Es gibt einige zusätzliche Einschränkungen im IE. Für iframe ist eine Grenze von 4 kb.

In IE9 wurde das 32-KB-Limit für DataURIs entfernt, obwohl ihre Verwendung aus Sicherheitsgründen auf bestimmte Kontexte beschränkt bleibt (insbesondere Szenarien, die einen Sicherheitskontext wie IFRAMES erstellen, sind verboten).

MSDN

Bruno Eberhard
quelle