Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: fortran1986 07. 11. 2025, 00:19:45
-
Ahojte v mojej web platforme ukladám obrázky do DB. Mám tam aj plnú velkosť obrázka a k tomu dva náhľady v rôznych velkostiach (MD, SM, Full):
Hlavný obrázok je uložený v takom formáte v akom ho nahral užívateľ (v prípade, že ide o webový formát teda webp, jpeg, png, gif, avif ak to neni webový formát napr psd, raw alebo tiff systém si ho skonvertuje do webp a uloží) a k nemu je v tabulke stĺpec contentType aby sme vedeli aký formát obrázok používa.
K databáze som spravil ImageCacheService ktorý tieto obrázky lazy metódou ukladá do filesystemu a keď treba posiela ku klientovi (je to rýchlejšie ako priamo select do db). Ak je v DB novší obrázok ako je dátum obrázka na disku obrázok sa prepíše verziou z DB. názvy obrázkov sú GUIDy tiež z DB tabulky a k nim som pridal extension (podla formátu) nakoľko súbory majú extension http server ich posiela so správnym mime type. Premýšlam ale že tie extensions vypnem. Aby som prípadným zlodejom podľa možnosti skomplikoval sťahovanie obrázkov. Viem že to neni veľká kompikácia (preto tam davam aj vodoznak atd) ale bol by som rád keby moje obrázky vyzerali takto:
<img src="5b17f8185e71449983e3600a0c2d8527">
a nie takto:
<img src="5b17f8185e71449983e3600a0c2d8527.webp">
ide len o to že tie mime types sú v DB a ja som robil cache koli tomu aby som nerobil zbytočne veľa prístupov do DB, keď koncovku vypnem, ako zistím mimeType obrázka? Mám si urobiť nejakú ďalši in-memory cache na mimeTypes? Alebo na to použijem noSQL databázu. Keby išlo o malý web tak to vyriešim nejakým actorom s ConcurrentDictionary. Ale na webe budú možno aj 10tky miliónov obrázkov. Takže potrebujem riešenie ktoré do pamate načíta tie obrázky ktoré sa bežne načítajú a tie ostatné čo sa málo používajú, by mohol postupne čistiť garbage collector. Určite nechcem všetko v pamati.
-
AI mi radí použiť k SQL Serveru ešte noSQL
Redis, Memcached, atď
Ale ja neviem je to dobrý nápad? neni to kanón na vrabce? Ono by sa to dalo použiť neskôr aj na iné optimalizácie nie?
-
1/ Ukládat si do filecache včetně koncovky. Pomocí htaccess následně řešíš jen existenci
2/ Ukládat si do filecache bez koncovky, ale s fixním typem. IMHO poněkud vachrlaté. A u toho originálu se ti to asi nebude chtít.
3/ Ukládat si do filecache bez koncovky, a hned vedle ukládat soubor s mime. Něco jako "5b17f8185e71449983e3600a0c2d8527" = obsah. "5b17f8185e71449983e3600a0c2d8527.mime" a v něm obsah "image/png". Pokud se dotazuješ na soubor bez koncovky tak stejně budeš muset posílat nějak hlavičku, takže nějaká mikro-proxy tam bude potřeba. Pomocí čistě htaccess by to asi nešlo. Možná nějaké pravidlo na serveru, záleží.
-
Tu koncovku bych tam určitě nechal. Nebudeš muset manipulovat s hlavičkami HTTP.
Do databáze bych uložil jen názvy a náhledy. Originály obrázků do souborového systému. Vyzkoušeno.
-
Za prvé bych soubory neukládal do relační databáze, zejména když je pak stejně máte uložené ještě jednou na disku. Pokud ty obrázky nemáte ve více formátech (jeden obrázek), nechal bych v odkazech ty přípony – ničemu tam nepřekáží. Tvrzení, že byste tím zlodějům zkomplikoval stahování obrázků, je nesmysl. Na disku pak ty soubory také uložte s příponou a máte po problémech.
Pokud byste opravdu trval na tom, že soubory budou na disku uložené bez přípony, uložte jejich typ do rozšířených atributů. Pro uložení MIME typu dokumentu je určen atribut user.mime_type – některý web server pravděpodobně půjde nakonfigurovat tak, aby MIME typ z tohoto rozšířeného atributu načítal.