Na nabídku

Problematika velkých souborů (nad 500kb)


HTTP je textový protokol. Tím to začíná a končí. Nikdy nebyl konstruován pro přenášení velkých balíků dat, natož binárních. Na to jsou protokoly jako FTP nebo SFTP. Ale samozřejmě jde vše obejít. Já zde popíši, jak jsem to předvedl v KWebCMS.

Problém protokolů zaměřených na přenos velkých souborů je fakt, že nejsou (z důvodů třeba ověření uživatele) uživatelsky přívětivé. A uživatel je tvor neuvěřitelně líný až (ne)schopný všeho. Vůbec problematika konfliktu jednoduchosti ověření a bezpečnosti vydá na celou stať a dlouhý flejm pod ní. Navíc oddělený protokol nezapadá do architektury běžných stránek - prostě to prohlížeč ani server společně nezvládají. V době psaní textu se toto obcházelo flashovým nahráváním, které ovšem funguje jen s - ano - flashem. A ten se nějaké oblibě netěšil. Pak probíhá na serveru zpracování "po staru". S moderními prohlížeči ovšem přišel problém. Flash je modul mimo vlákno prohlížeče a vůči serveru se chová jako nové anonymní okno z jiného stroje. A v tu chvíli nastává problém s ověřením a otázka kam to uložit.

Další způsob je to vzít a celé to servu nacpat na jedné velké hromadě. Riziko pádu roste s každou sekundou nutnou k přenosu. Buď to může odhvízdat linka nebo rovnou server, nakonec včetně přihlášení. V každém případě to znamená pád.

KWebCMS modul UploadPerPartes používá naopak techniky z HTML5 a přímo souborových protokolů. Tím mám na mysli javascriptové funkce, které sbírají dodané soubory a následně je předchroustají pro odeslání. A pak posílání po menších porcích a následné skládání souborů na serveru. Díky způsobu řízení výzva-odpověď je to docela přežitelné a ve finále i testovatelné. Dokonce to šlo upravit pro python a nemám pochyb, že se to dá využít i u dalších jazyků.

Jak to funguje:

Uživatel prohlížeči řekne, že chce nahrát nějaké soubory. Prohlížeč zavolá pro každý soubor zvláštní postupku a vyzve server, aby mu řekl, jestli může nahrávat. Server se podívá do uživatelovy aktuální složky. Soubory se tam buď válí, a pak následuje hledání nového jména, nebo neválí, a pak server vyzve prohlížeč k posílání jednotlivých částí. Prohlížeč pak postupně odešle části a počká na odpovědi od serveru. V odpovědi na poslední balík přijde informace, že jsme skončili a je na čase to oznámit uživateli. Vedlejším produtkem tohoto stylu je i lištička s průběhem nahrávání, která ale nelže - na serveru je uloženo a dostupné přesně to, co je vyznačno.

Mám to otestované i na souborech o velikosti 4 giga na 100Mbit síti a čekám, že ani větší, ač s ohledem na prostředky na druhé straně a tloušťku linky, nebudou problém. Omezením u KWebCMS je nemožnost změnit během nahrávání složku, což je ale dané kódem a ne principem. Plus je možnost přerušit nahrávání (nestabilita sítě) a začít od poslední funkční části.

Petr Plšek, 182 00 Praha, me@kalanys.com