L'URL data

Plutot meconnue, ce format d'URL permet d inclure dans une page HTML une image sans referencer un fichier externe. On parle aussi d'image embarquee ( desole, j ai pas trouve mieux comme traduction d'embedded :)

Ce format est defini dans un RFC -dont j ai oublie le numero-, d'ailleurs redige par un developpeur de Netscape me semble-t-il :)

A noter que ce format est uniquement supporte par les navigateurs Netscape. Sous IE vous obtiendrez une image cassee.

Synopsis

Voici la maniere traditionnelle d'inclure une image dans une page HTML:

	<img src="img/box.gif">

Resultat:

Image inclue par une URL data:

	<img src="data:image/gif;base64,R0lGODlhFAAWAMIAAP///8z//8zMzJmZmTMzMwCZMwBmMwAAACH+TlRoaXMgYXJ0IGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiBLZXZpbiBIdWdoZXMsIGtldmluaEBlaXQuY29tLCBTZXB0ZW1iZXIgMTk5NQAh+QQBAAABACwAAAAAFAAWAAADf0i6vPEwEECrnSS+aTvPEddVIriN1wWJ1GEdBCyf1TG47aHvNGAPAtdgSLzRfsBgkXg4FoaCKJLpfEaly6akVeheDVPj1tf1GsBEgJhzKBfO6AFlXSvDbYA8PU9+n3F6Wixkf3yBPXwHYIaHY4yAhnuMk40KS5dEMRE7nJ2cDwkAOw">

Resultat:

Format

le format de cette URL est :

data:mime-type;content-encoding,encoded-content

Note: le premier separateur est un point-virgule, le deuxieme une virgule.

Avantages et inconvenients

D'une maniere generale, c'est utile dans les cas on veut un document unique. C'est par exemple le cas d'un mail au format HTML, lorsque le destinataire du mail n'est pas connecte au web ( et ne verrait donc pas les images du document).

Le RFC specifie bien que la taille de l'image embarquee doit rester "raisonnable" sans preciser de taille limite.

Exemple de code PHP

Voici un bout de code permettant d'embarquer une image dans un doc HTML via une URL data:

	<?
		// Format du tag img avec un hanfler d'url data:
		$fmtImgData = '<img src="data:%s;%s,%s" border="1">';
		$filename = "img/ns.jpg"; // fichier image a inclure
		$linesz = filesize( $filename )+1; // retrieve la taille du fichier
		$fp = fopen( $filename, 'r' ); // ouvre le fichier
		echo "<html><body>Test of data url in PHP<br>\n\n";
		// affiche l'image
		printf( $fmtImgData,
			"image/jpeg" ,
			"base64",
			chunk_split( base64_encode( fread( $fp, $linesz) ) ) );
		fclose( $fp ); // ferme le fichier image
		echo "\n\n</body></html>\n"; // ferme la page
	?>
Demonstration

Statut

AuteurLeo West
Dtcreate30 Jun 2000
Dtmod30 Jun 2000