Data-URL
Ein Data-URL ist ein URI-Schema, das es ermöglicht, Daten in (HTML-)Quelltext so einzubetten, als wären es externe Ressourcen. Damit können die Daten, beispielsweise für eine Grafik, innerhalb eines HTML-Dokuments direkt im HTML-Quelltext untergebracht werden, statt sie, wie sonst üblich, aus einer Datei anzufordern.
Dies ist tendenziell einfacher als andere Einbettungsmethoden wie MIME mit cid
- oder mid
-URIs (siehe dazu RFC 2111[1]). Data-URLs werden oft als Uniform Resource Locators bezeichnet, obwohl sie keinen externen Inhalt referenzieren. In Wirklichkeit sind sie Uniform Resource Identifiers. Die Data-URL wird im RFC 2397[2] der Internet Engineering Task Force (IETF) definiert.
Obwohl die IETF die Data-URL-Spezifikation 1998 veröffentlichte,[2] wurde diese niemals formell zum Standard erhoben.[3] Die Spezifikation von HTML 4.01 (Dezember 1999) verweist jedoch auf die Definition des Data-URL,[4] und die meisten aktuellen Webbrowser unterstützen Data-URLs.
Webbrowser-Unterstützung
BearbeitenAktuell unterstützen folgende Webbrowser Data-URLs:
- Gecko-basierte Browser, wie Mozilla Firefox
- Opera
- Microsoft Edge
- KDE durch das KDE Input/Output-System. Dies erlaubt dem KDE-Browser, Konqueror, Data-URLs zu unterstützen.
- Apple Safari; obwohl Safaris HTML-Rendering-Engine, WebKit, auf KHTML basiert, teilt Mac OS X nicht die KDE-Input/Output-Architektur und die Implementation.
- Apple Safari für das iPhone
- Google Chrome
- Microsoft Internet Explorer bis einschließlich Version 7 unterstützt Data-URLs nicht. Internet Explorer 8 begrenzt die Unterstützung aus Sicherheitsgründen auf nicht navigierbaren Inhalt, wie in
<img>
-Tags und CSS-Regeln, damit in Data-URLs eingebettetes JavaScript nicht trotz Scriptfilter, wie sie bei Webmail-Clients verwendet werden, ausführbar ist.[5] Data-URLs müssen kleiner als 32 Kilobytes sein. Die Einschränkung wurde im IE9 aufgehoben.[6]
Format
Bearbeitendata:[<MIME-Typ>][;charset=<Zeichensatz>][;base64],<Daten>
Die Kodierung wird durch ;base64
gekennzeichnet. Wenn vorhanden, bedeutet das, dass die nachfolgenden Daten Base64-kodiert sind. Anderenfalls, bei Fehlen des base64
-Parameters, werden die Daten durch URL-Encoding kodiert. Wenn die Angabe des MIME-Typs fehlt, wird als MIME-Typ text/plain;charset=US-ASCII
angenommen. Bei abweichendem Zeichensatz kann als Abkürzung der MIME-Typ bei Plain text weggelassen, aber der Zeichensatz-Parameter benutzt werden.
Vorteile
Bearbeiten- Eingebettete Daten benötigen keinen HTTP-Request und sparen Traffic und Bandbreite, wenn der Overhead der Kodierung kleiner ist als der HTTP-Overhead. Beispielsweise ist ein 600 Byte großes Bild Base64-kodiert 800 Bytes groß (wenn es unkomprimiert übertragen wird; HTML und CSS werden zumeist komprimiert übertragen). Wenn nun der HTTP-Overhead mehr als 200 Bytes beträgt, ist die Data-URL effizienter.
- Für das Transportieren von vielen kleinen Dateien kann die Data-URL im Transport schneller sein. TCP-Verbindungen tendieren zu langsamem Start. Wenn jede Datei eine neue TCP-Verbindung benötigt, ist die Transportgeschwindigkeit mehr durch die Laufzeit begrenzt als durch die verfügbare Bandbreite. Das Benutzen von HTTP-Keepalive verbessert die Situation, beseitigt aber den Engpass nicht völlig.
- Wenn die Webseite über HTTPS aufgerufen wird, erwarten die meisten Webbrowser, dass alle Elemente dieser Webseite ebenfalls über eine sichere Verbindung nachgeladen werden, ansonsten wird der Benutzer benachrichtigt, dass durch die Mischung von sicheren und unsicheren Elementen die Sicherheit reduziert ist. HTTPS hat einen signifikant höheren Overhead als normales HTTP, somit erhöht die Einbettung von Webseitenelementen in Data-URLs die Geschwindigkeit in diesem Fall und verhindert, dass Sicherheitswarnungen ausgegeben werden.
- Webbrowser sind gewöhnlich so konfiguriert, dass nur eine bestimmte Maximalanzahl an HTTP-Verbindungen zum gleichen Webserver aufgebaut werden,[7] somit sparen eingebettete Daten zu Gunsten anderer Inhalte HTTP-Verbindungen ein.
- Umgebungen mit eingeschränktem oder gesperrten Zugang zu externen Ressourcen können Inhalte einbetten, wenn es nicht erlaubt oder unpraktisch ist, diese extern zu referenzieren. Zum Beispiel könnte ein erweitertes HTML-Editorfeld ein eingefügtes Bild akzeptieren und es zu einer Data-URL umwandeln, um die Komplexität der externen Referenzierung vor dem Benutzer zu verstecken.
- Eine Multimediaseite kann als eine einzige Datei verwaltet werden.
- Obwohl es selten passiert, kann es vorkommen, dass die Integrität der Dateien verletzt wird, wenn sie hochgeladen werden. Das kann Data-URLs nur passieren, wenn die Integrität der gesamten Seite verletzt ist.
Nachteile
Bearbeiten- Data-URLs können nicht separat von den sie enthaltenden Dokumenten (beispielsweise HTML- oder CSS-Dateien) gecacht werden, somit werden die Daten erneut heruntergeladen, wenn (je nach Einbettungsort) entweder das Dokument neu geladen wird oder sich die CSS-Datei an anderer Stelle geändert hat.
- Die Data-URL muss erneut kodiert und eingebettet werden, wenn eine Änderung durchgeführt wurde.
- Die Daten werden als einfacher Datenstrom eingebunden, und viele Laufzeitumgebungen wie Webbrowser unterstützen keine Containerformate (wie
multipart/alternative
odermessage/rfc822
), um Daten größerer Komplexität wie Metadaten, komprimierte Daten oder Content Negotiation zu speichern. - Base64-kodierte Daten sind um ein Drittel größer als ihr binäres Äquivalent. Dieser Nachteil relativiert sich, wenn der Server die Antwort mit Hilfe des
Content-Encoding
-HTTP-Headers komprimiert. - Data-URLs machen es Sicherheitssoftware schwerer, Inhalte zu filtern.[2]
- Webbrowser auf mobilen Geräten (z. B. Smartphones) haben in der Regel eine Funktion, mit der das Laden von Bildern deaktiviert werden kann, um Datenvolumen zu sparen. Das direkte Einbetten in das Dokument verhindert die Nutzung einer solchen Funktion.
Beispiele
BearbeitenHTML
BearbeitenDer rote Punkt aus dem Beispiel links |
Ein HTML-Fragment, welches das Bild eines kleinen roten Punktes einbindet:
<img src="data:image/png;base64,
iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAXUlEQVQY073M
vQ2CUADE8R90tOzgFkzgMg7gLs7BCDYmhD0sTV7F2Vi8EF5nuOpyH3/+rW4f
hMvPDh3r4Stcwxxe4dbEh3co4ROedddXowmlyrYwtoj3sIRHc3S+vgySGhd7
StmKAAAAAElFTkSuQmCC" alt="Roter Punkt" />
Wie oben gezeigt, kann die Data-URL Whitespace zur besseren Lesbarkeit enthalten. Der geneigte Leser kann den zwischen den Gänsefüßchen stehenden Text ausschneiden und in die Adresszeile eines unterstützenden Browsers eingeben.
CSS
BearbeitenEine CSS-Regel, welche ein Hintergrundbild einbindet:
ul.checklist li.complete { margin-left: 20px; background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD///+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4Ug9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC') top left no-repeat;}
JavaScript
BearbeitenEin JavaScript-Beispiel, welches ein neues, eingebettetes Fenster öffnet, zum Beispiel für eine Fußnote:
window.open('data:text/html;charset=utf-8,%3C%21DOCTYPE%20html%3E%0D%0A%3Cht'+
'ml%20lang%3D%22en%22%3E%0D%0A%3Chead%3E%3Ctitle%3EEmbedded%20Window%3C%2F'+
'title%3E%3C%2Fhead%3E%0D%0A%3Cbody%3E%3Ch1%3E42%3C%2Fh1%3E%3C%2Fbody%3E%0'+
'A%3C%2Fhtml%3E%0A%0D%0A','_blank','height=300,width=400');
Dieses Beispiel funktioniert nicht im Internet Explorer 8. Seine Sicherheitseinstellungen verbieten navigierbare Dateitypen in Data-URLs.[5]
Einfügen in HTML oder CSS mit PHP
BearbeitenWeil Base64-kodierte Data-URLs nicht menschenlesbar sind, könnte ein Webseitenersteller kodierte Daten vorzugsweise mit einer Skriptsprache wie PHP einfügen. Das hat den Vorteil, dass bei einer Änderung der eingebundenen Datei der HTML-Quelltext nicht geändert werden muss sowie binäre Daten vom Text getrennt werden. Der Nachteil ist eine höhere Belastung der Server-CPU, wenn kein serverseitiger Cache benutzt wird.
<?php
function data_uri($file, $mime)
{
$contents = file_get_contents($file);
$base64 = base64_encode($contents);
return ('data:' . $mime . ';base64,' . $base64);
}
?>
<img src="<?php echo data_uri('elephant.png','image/png'); ?>" alt="Ein Elefant" />
Die oben abgebildete Funktion kann auch auf CSS-Daten angewendet werden:
<?php header('Content-type: text/css');?>
div.menu
{
background-image:url('<?php echo data_uri('menu_background.png','image/png'); ?>');
}
Client- oder serverseitige Funktionen wie Conditional Comments oder User-Agent-Abfragen können benutzt werden, um alternative URLs für ältere Browser wie den Internet Explorer bis Version 7 anzubieten.
Konvertierungswerkzeuge
Bearbeiten- alles2DataURL ist ein kostenloses Online-Werkzeug für die Umwandlung beliebiger Dateiformate (bis zu einer Maximalgröße von ca. 3 MB) in eine Data-URL.[8]
- DataURL2Text ist ein kostenloses Online-Werkzeug für die Rückumwandlung einer beliebigen Data-URL in die Originaldaten.[9]
- Clipboard Observer ist ein kostenloses Java-Werkzeug für einfaches Konvertieren von PNG-Dateien zu einer Data-URL.[10]
Siehe auch
Bearbeiten- Ein alternatives Verfahren für das Einbetten von Ressourcen ist MHTML, meist benutzt in HTML-E-Mails.
- Internet Media Type für die benutzten Dateitypen
Weblinks
Bearbeiten- RFC: – The “data” URL scheme. 1998 (englisch).
- Über Data-URLs. Mozilla Developer Center (englisch).
- Data-URL-Tests. (englisch).
- Data-URLs effektiv mit Cascading Style Sheets nutzen. sveinbjorn.org (englisch).
- Übersicht zur Browserunterstützung von Data-URL. caniuse.com
Einzelnachweise
Bearbeiten- ↑ RFC: – Content-ID and Message-ID Uniform Resource Locators. März 1997 (englisch).
- ↑ a b c RFC: – The “data” URL scheme. 1998 (englisch).
- ↑ Proposed Standards. In: Official Internet Protocol Standards. Internet Society, 4. Januar 2009, abgerufen am 4. Januar 2009.
- ↑ Dave Raggett, Arnaud Le Hors, Ian Jacobs: Objects, Images, and Applets: Rules for rendering objects. In: HTML 4.01 Specification. W3C, 24. Dezember 1999, abgerufen am 20. März 2008.
- ↑ a b data Protocol. MSDN, abgerufen am 5. Januar 2009.
- ↑ Eric Law: IE9 Beta Minor Changes List. In: blogs.msdn.com. Abgerufen am 28. Oktober 2010.
- ↑ RFC: – Hypertext Transfer Protocol – HTTP/1.1. Juni 1999, Abschnitt 8 (englisch).
- ↑ alles2DataURL
- ↑ DataURL2Text
- ↑ Clipboard Observer