Devel.cz Lupa Měšec Podnikatel Root Zdroják.cz DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

Datová URL pomohou s malými soubory

Ve světě nových webových technologií se nashromáždilo zase několik drobností a novinek, o nichž jsme na Zdrojáku nepsali. Teď je vhodná příležitost to trochu napravit a na některé se podívat. Začneme datovými URL, které sice nejsou až taková novinka, ale někteří webdesignéři a kodéři o nich stále nevědí.

Tweetni to Twitter Jaggni to! Jagg Del.icio.us Delicious

Datová URL někteří vývojáři vůbec neznají (a diví se „bordelu v HTML“), jiní je považují za módní výstřelek, a další je bez většího povyku prostě používají. Oč vlastně jde a jak to vypadá?

Co jsou DataURL?

DataURL (někdy uváděno jako DataURI, ovšem RFC2397 hovoří o DataURL) je URL se schématem „data:“ a jeho obsahem jsou binární data. Příklad vše ozřejmí:

Představme si, že máme stránku, a na ní máme miniikonku, řekněme, pro tisk souborů. Takto: printIkonka je ve formátu png, má rozměry 16×16px a zabírá 629 bajtů. 

Všichni známe běžný způsob vložení do stránky: <img src="http://ukazky.zdrojak.cz/novinky/print.png" alt="print">. Funguje, je ověřený, tak co je na tom za vědu?

Každý takový objekt je totiž přenášen zvlášť. Otevře se pro něj spojení, server je požádán o data pro tento soubor, on je vrátí a prohlížeč to celé zobrazí. Kvůli 629 bajtům letěly po síti kilobajty dotazů, odpovědí, servisních informací… Možná požadavek čekal ve frontě. Pokud je takových obrázků na stránce víc, pak data létají a fronty čekají… Schválně si zkuste změřit objem dat, která jsou přenesena při takovém dotazu, třeba na úrovni TCP – stovky bajtů hlaviček, cookies a dalších „neužitečných“ dat. Efektivita takových dotazů je opravdu velmi nízká.

Pro tyto situace je někdy výhodnější použít DataURL, kde jsou samotná binární data přímo součástí URL. Výše uvedená ikonka bude do kódu vložena jako

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8
/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZT
wAAAIHSURBVHjajFNBaxNBFP6SLNq0WGNSsS0ohFiiFUx6UNFCLsmph4jgqdKL0KgI/QMe7MV
DEAQF8VDoMVtKoejB0OToRTQRDxpcmrC2SXSppG7ajV2yScadWTam6Sb4wdth3vve997M7LMR
QmBi40uVZL5J+CD+Rjeuek/h0W2/rdtv6xS4+fQ9Wb4/BYfdhmbrn/+XUsfqJxnFbQlLD64cE
rF3K9Lk/K4douxgltsBfKedmLk8hrPnRvFkTSB9BaxQ3lXhdTVx78bIkeNxVgkDnKGrNlpwHn
NA2FH1XRPXvM4jXMbMZDIkHo+TXkKDzgFmJmKxGEmn04xvF0WRZLNZhMNh9OqGdtGJ2TtzSCa
TrDCXSqUQCoXgdrsR2H+JZ/G3Pe8irVtAt4sXHurfW0gkEuBkWcb5iQlGiEaj8Pv9fS9UEAS4
PR5MT1/Hm9fr4Gq1WjuYzxfg0YOVSsUymcYoJxAMsr2iKMYr5Dc3maNalaGqKpTagaXA0JCKr
a3vbX65XAZHVUqlEnPQ41BodbXvMUx+oVAwOtA0jTlcLhd4nm8TqTg1WskEvSOT3/6R9vb2MT
x8ghEnJy9hdGzcsrL08wcWFx8jEomgWCwaw8TzKySX+wpJkkCm5vHibhB/6i0WbDSM9UBrsvX
MyeNYWP6Md8/n4PP52Ksdmsb5Vx/J/8xG50T+FWAAPKDZ6z1/DUMAAAAASUVORK5CYII=">

a bude vypadat takto: print přes DataURL (pokud zde nic nevidíte, použijte prohlížeč ne starší tří let)

Jak na DataURL?

Z příkladu je bystřejším patrné, jak DataURI vypadá. Jeho formát je: data[;charset=<en­coding>][;base64],<da­ta>. Tedy:

  1. Začíná názvem schématu data a dvojtečkou,
  2. za ním je (nepovinný) parametr MIME typ, v němž uvedeme typ souboru (uvádějte jej a nespoléhejte na to, že to prohlížeč „nějak zpracuje“)
  3. za ním je „znaková sada“ – v případě že jde o textové soubory, třeba text/html, jinak nemá smysl a lze ji vynechat
  4. za znakovou sadou je použité kódování – téměř výhradně se používá Base64. Parametr je sice opět nepovinný, ale je lépe ho uvést, nic tím nezkazíme
  5. za čárkou následují data v daném kódování (tedy převážně Base64)

Pokud budeme chtít takové DataURL vytvořit třeba pro miniobrázek červené tečkyčervená tečka, budeme postupovat jednoduše: PNG soubor si převedeme do reprezentace v Base64 (iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO 9TXL0Y4OHwAAAABJRU5ErkJggg== ) a zapíšeme URL jako:

data:image/png;base64,(...a sem přijdou data...)

S generováním vám mohou pomoci nástroje jako The DataURLMaker (pro obrázky), the data: URI kitchen nebo elegantní Drag-n-drop DataURL generator. Můžete využít serverového skriptovacího jazyka, jak ukazuje např. výše odkázaný článek na Wikipedii:

<?php
function data_uri($file, $mime) {
    $contents = file_get_contents($file);
    $base64 = base64_encode($contents);
    return ("data:$mime;base64,$base64");
}
?>

Kde to lze použít?

Použití pro obrázky je jasné – v atributu SRC u elementu IMG. DataURL lze použít i v CSS tam, kde se vyskytuje konstrukce url()  – u background-image, list-style-image atd. Můžete dataURL použít i v JavaScriptu, např. jako parametr pro window.open(). Můžete je použít jako favicon – zkrátka všude tam, kde používáte „běžná“ URL s http: či https:. Tedy např. i v <a href…> Můžete si zkusit drobnou ukázku DataURL.

Libůstky prohlížečů

IE ve verzi 8 vyžadoval, aby DataURL měl méně než 32kB a omezoval jeho použití na elementy img, link, object a input type=image. Od verze 9 tato omezení nejsou. Firefox zase nesnese znak konce řádku v datech (pozor na to, některé převaděče do Base64 zalamují řádky).

Co tím získáme? Co ztratíme?

Jako všude jsou zde jak výhody, tak nevýhody. Výhody jsou jasné – u malých souborů ušetříme velké množství přenesených dat, a to i přesto, že jsou DataURL o třetinu větší než původní soubory (viz princip kódování Base64). Navíc při použití transparentního gzip pro webové stránky je nárůst velikosti jen v řádu jednotek procent. Ušetříme si režii s otvíráním spojení (a co teprv u stránek přes HTTPS!) a vyhneme se frontám. DataURL můžeme použít např. i v CSS – pro nejrůznější obrázky na pozadí či ikony.

Výhodné je použití v případech, kde chcete mít jeden HTML soubor, bez doplňkových souborů, a přesto v něm použít ikony. Hezký příklad jsou „exportované záložky“ z prohlížeče Chrome – favicony jednotlivých webů jsou zapsány v HTML právě v podobě DataURL (Google vůbec DataURL poměrně intenzivně používá).

Na druhé straně jsou nevýhody: Takový obrázek se necachuje. U přímého odkazu může prohlížeč uložit soubor do cache a může ho použít třeba na jiné stránce. U DataURL žádný soubor není, cache se nekoná a v každé stránce bude muset být obsah znovu uvedený. Budou se načítat při každém refreshi (pokud je ale použijete v externím CSS souboru, tak to až tak neplatí). Při změně ikonek musíte změnit všechny DataURL ve všech souborech, kde jsou použitá… Někomu se nebude líbit „nehezký HTML kód“, zanesený „ošklivým nepohledným chaosem znaků“.

Používat, nebo nepoužívat?

Záleží na každém kodérovi či vývojáři a na jeho zvážení.

Podpora v prohlížečích je velmi slušná – viz Caniuse#dataURI.

Pro malé ikonky můžou výhody převážit. Posílat takto stokilovou fotografii se ale zcela jistě nevyplatí, tam nebudou úspory žádné. Nejdůležitější při rozhodování bude, jako vždy, pravidlo uměřenosti a vhodnosti pro daný cíl – bezhlavé nasazení DataURL všude možně bude mít jediný předpokládatelný výsledek: vlnu znechucení a odporu k „téhleté nové pitomosti“. Což by byla škoda.

Ke čtení…

Martin Malý

Martin Maly

Začal programovat v roce 1984 s progra­movatelnou kalkulačkou. Pokračoval k BASICu, assembleru Z80, Forthu, Pascalu, Céčku, dalším assemblerům, před časem v PHP a teď je rád, že neprogramuje…

Školení: Hackujeme operační systém Android

 

Školení vám ukáže, jak se dostat k Linuxu (tzv. "rootování"), který se pod hezkou tváří Androida skrývá a jak ho naplno využít. Pomůže vám to při záloze dat, zvětšování prostoru pro aplikace nebo sdílení připojení k internetu a pokud chcete z telefonu dostat opravdové maximum, ukážeme vám, jak v něm vyměnit kompletní systém za lepší.

Podrobnější informace a přihláška

Přehled názorů

jmeno souboru
Vit Hnilica 8. 8. 2011 02:03
Nový
Datová URI v Nette
David Grudl 8. 8. 2011 02:27
Nový
├ 
Re: Datová URI v Nette
Martin Malý 8. 8. 2011 03:23
Nový
├ 
Re: Datová URI v Nette
Reklamní agentura Grudl 8. 8. 2011 11:09
Nový
│
├ 
Re: Datová URI v Nette
Franta Kučera 8. 8. 2011 11:30
Nový
│
└ 
Re: Datová URI v Nette
dg 8. 8. 2011 12:18
Nový
│
 
└ 
Re: Datová URI v Nette
. 9. 8. 2011 06:18
Nový
└ 
Re: Datová URI v Nette
RadekJU 9. 8. 2011 11:43
Nový
 
└ 
Re: Datová URI v Nette
David Grudl 9. 8. 2011 12:39
Nový
PNG očistit
Peter Kahoun 8. 8. 2011 02:49
Nový
└ 
Re: PNG očistit
Martin Malý 8. 8. 2011 03:21
Nový
 
├ 
Re: PNG očistit
Bubák 8. 8. 2011 05:15
Nový
 
│
├ 
Re: PNG očistit
Martin Malý 8. 8. 2011 08:00
Nový
 
│
├ 
Re: PNG očistit
nikdo 8. 8. 2011 09:01
Nový
 
│
│
└ 
Re: PNG očistit
Bubák 8. 8. 2011 13:38
Nový
 
│
└ 
Re: PNG očistit
Ondřej Súkup 8. 8. 2011 16:21
Nový
 
│
 
└ 
Re: PNG očistit
blizz 9. 8. 2011 23:09
Nový
 
│
 
 
└ 
Re: PNG očistit
Bubák 9. 8. 2011 23:56
Nový
 
└ 
Re: PNG očistit
Peter Kahoun 8. 8. 2011 11:15
Nový
HTML
Bronislav Klučka 8. 8. 2011 08:18
Nový
└ 
Re: HTML
Martin Malý 8. 8. 2011 08:35
Nový
Režie
V. H. 8. 8. 2011 09:04
Nový
├ 
Re: Režie
Miroslav Suchý 8. 8. 2011 09:39
Nový
│
├ 
Re: Režie
jj 8. 8. 2011 09:52
Nový
│
│
└ 
Re: Režie
Miroslav Suchý 8. 8. 2011 11:45
Nový
│
│
 
└ 
Re: Režie
Martin Malý 8. 8. 2011 12:15
Nový
│
│
 
 
└ 
Re: Režie
. 9. 8. 2011 06:45
Nový
│
│
 
 
 
└ 
Re: Režie
Martin Malý 9. 8. 2011 09:09
Nový
│
└ 
Re: Režie
lol 8. 8. 2011 09:54
Nový
│
 
└ 
Re: Režie
Miroslav Suchý 8. 8. 2011 11:48
Nový
└ 
Re: Režie - nejde jen o pocet Byte
Michal sjx 13. 8. 2011 02:00
Nový
MHTML
maryo 8. 8. 2011 10:47
Nový
Re: Datová URL pomohou s malými soubory
Franta Kučera 8. 8. 2011 11:24
Nový
└ 
Re: Datová URL pomohou s malými soubory
Martin Malý 8. 8. 2011 12:09
Nový
Další možnost použití je s lokální databází
Pavel Kroh 8. 8. 2011 12:05
Nový
canvas
IT expert 8. 8. 2011 21:27
Nový
Ikonky
BoodOk 9. 8. 2011 17:08
Nový
v IE 9 w7x64 mi nefunguje odkaz
Mirek 10. 8. 2011 08:40
Nový
Re: Datová URL pomohou s malými soubory
Mirek 10. 8. 2011 08:45
Nový
└ 
Re: Datová URL pomohou s malými soubory
Franta Kučera 10. 8. 2011 09:16
Nový
Sprite
Míra Pancíř 10. 8. 2011 15:44
Nový
└ 
Re: Sprite
Křestní Příjmení 12. 8. 2011 13:11
Nový
kdy to pouzit
expert 10. 8. 2011 21:41
Nový
Django
Visgean Skeloru 18. 8. 2011 02:42
Nový
       

Tento text je již více než dva měsíce starý. Chcete-li na něj reagovat v diskusi, pravděpodobně vám již nikdo neodpoví. Pro řešení aktuálních problémů doporučujeme využít naše diskusní fórum.

Zasílat nově přidané příspěvky e-mailem